[SQL] 어떻게 MySQL의에서 자동 증가 필드와 동일한 테이블의 행과 삽입을 복사하려면?
SQL어떻게 MySQL의에서 자동 증가 필드와 동일한 테이블의 행과 삽입을 복사하려면?
MySQL 그럼 I는 자동 증가 컬럼 ID = 1 행을 복사 열 ID = 2를 가진 새로운 행과 동일한 테이블로 데이터를 삽입하는 것을 시도하고있다.
어떻게 하나의 쿼리에서이 작업을 수행 할 수 있습니다?
해결법
-
==============================
1.사용 INSERT ... SELECT :
사용 INSERT ... SELECT :
insert into your_table (c1, c2, ...) select c1, c2, ... from your_table where id = 1
여기서, C1, C2, ... 아이디를 제외한 모든 열이 있습니다. 명시 적 2의 ID로 삽입하려면 다음을 포함하여 INSERT 열 목록과 SELECT에서 해당 :
insert into your_table (id, c1, c2, ...) select 2, c1, c2, ... from your_table where id = 1
당신은 물론 두 번째 경우에 2의 가능한 중복 ID 알아서해야합니다.
-
==============================
2.IMO, 최고의 동시에 단지 당신이해야 열을 참조하고 변경하려는 동안 만 해당 행을 복사하는 SQL 문을 사용하는 것 같다.
IMO, 최고의 동시에 단지 당신이해야 열을 참조하고 변경하려는 동안 만 해당 행을 복사하는 SQL 문을 사용하는 것 같다.
CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY SELECT * FROM your_table WHERE id=1; UPDATE temp_table SET id=NULL; /* Update other values at will. */ INSERT INTO your_table SELECT * FROM temp_table; DROP TABLE temp_table;
어떻게 SQL 기록을 복제하는 - 또한 av8n.com보기
혜택:
-
==============================
3.말 테이블은 사용자 (아이디, USER_NAME, USER_EMAIL)입니다.
말 테이블은 사용자 (아이디, USER_NAME, USER_EMAIL)입니다.
이 쿼리를 사용할 수 있습니다 :
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
-
==============================
4.이것은 도움과는 BLOB / TEXT 컬럼을 지원합니다.
이것은 도움과는 BLOB / TEXT 컬럼을 지원합니다.
CREATE TEMPORARY TABLE temp_table AS SELECT * FROM source_table WHERE id=2; UPDATE temp_table SET id=NULL WHERE id=2; INSERT INTO source_table SELECT * FROM temp_table; DROP TEMPORARY TABLE temp_table; USE source_table;
-
==============================
5.여기에 설명 된대로 열 이름을 필요로하지 않는 신속하고 깨끗한 솔루션의 경우, 준비된 문을 사용할 수 있습니다 : https://stackoverflow.com/a/23964285/292677
여기에 설명 된대로 열 이름을 필요로하지 않는 신속하고 깨끗한 솔루션의 경우, 준비된 문을 사용할 수 있습니다 : https://stackoverflow.com/a/23964285/292677
자주이 작업을 수행 할 수 있도록 복잡한 솔루션을 필요로하는 경우이 절차를 사용할 수 있습니다 :
DELIMITER $$ CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text) SQL SECURITY INVOKER BEGIN SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns; SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns; SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')', 'SELECT ', @columns, ' FROM ', _schemaName, '.', _tableName, ' ', _whereClause); PREPARE stmt1 FROM @sql; EXECUTE stmt1; END
당신은 그것을 실행할 수 있습니다 :
CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');
예
duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200 duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column duplicateRows('acl', 'users'); -- will duplicate all records in the table
면책 조항 :이 솔루션은 종종 여러 테이블에서 반복적으로 중복 행이 될 것이다 사람만을위한 것입니다. 그것은 악의적 인 사용자의 손에 위험 할 수 있습니다.
-
==============================
6.레코드가 생성 될 때 당신은 또한, 올바른 값이 사용되는 자동 증가에 컬럼의 값으로 '0'에 전달할 수 있습니다. 이것은 너무 쉽게 임시 테이블보다.
레코드가 생성 될 때 당신은 또한, 올바른 값이 사용되는 자동 증가에 컬럼의 값으로 '0'에 전달할 수 있습니다. 이것은 너무 쉽게 임시 테이블보다.
출처: MySQL의 행을 복사 (로어 의해, 제 용액에 의해 삼각, 제 주석 참조)
-
==============================
7.
insert into MyTable(field1, field2, id_backup) select field1, field2, uniqueId from MyTable where uniqueId = @Id;
-
==============================
8.여기에 큰 응답을 많이합니다. 아래는 내가 웹 응용 프로그램 내가 개발하고 있음에 대해이 작업을 수행하는 데 쓴 저장 프로 시저의 예입니다 :
여기에 큰 응답을 많이합니다. 아래는 내가 웹 응용 프로그램 내가 개발하고 있음에 대해이 작업을 수행하는 데 쓴 저장 프로 시저의 예입니다 :
-- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON -- Create Temporary Table SELECT * INTO #tempTable FROM <YourTable> WHERE Id = Id --To trigger the auto increment UPDATE #tempTable SET Id = NULL --Update new data row in #tempTable here! --Insert duplicate row with modified data back into your table INSERT INTO <YourTable> SELECT * FROM #tempTable -- Drop Temporary Table DROP TABLE #tempTable
-
==============================
9.당신이 경우있는 거 MySQL의 워크 벤치를 사용할 수, 당신은이 작업을 수행 할 수 있습니다 행과 선택 '복사 행'을 클릭 오른쪽, 다음, 다음 빈 행과 선택 '행을 붙여 넣기'를 마우스 오른쪽 단추로 클릭 한 다음 ID를 변경하고, 클릭 '적용'.
당신이 경우있는 거 MySQL의 워크 벤치를 사용할 수, 당신은이 작업을 수행 할 수 있습니다 행과 선택 '복사 행'을 클릭 오른쪽, 다음, 다음 빈 행과 선택 '행을 붙여 넣기'를 마우스 오른쪽 단추로 클릭 한 다음 ID를 변경하고, 클릭 '적용'.
행을 복사합니다 :
빈 행에 복사 된 행을 붙여 넣습니다 :
ID를 변경 :
대다:
-
==============================
10.나는 같은 기능을 찾고 있었다 그러나 나는 MySQL을 사용하지 않습니다. 나는 물론 기본 키 (ID)의 제외한 모든 필드를 복사하고 싶었다. 이되지 않은 스크립트 나 코드에서 사용할 수있는 한방 쿼리이었다.
나는 같은 기능을 찾고 있었다 그러나 나는 MySQL을 사용하지 않습니다. 나는 물론 기본 키 (ID)의 제외한 모든 필드를 복사하고 싶었다. 이되지 않은 스크립트 나 코드에서 사용할 수있는 한방 쿼리이었다.
나는 PL / SQL과 주위에 내 길을 찾았지만 나는 확실히 다른 SQL IDE 할 것입니다. 나는 기본을했다
SELECT * FROM mytable WHERE id=42;
내가 찾을 수있는 곳 그런 다음 SQL 파일로 내보내기
INSERT INTO table (col1, col2, col3, ... , col42) VALUES (1, 2, 3, ..., 42);
난 그냥 그것을 편집하고 그것을 사용 :
INSERT INTO table (col1, col2, col3, ... , col42) VALUES (mysequence.nextval, 2, 3, ..., 42);
-
==============================
11.나는 뮤 너무 짧은 게시 무엇의 변형을 사용하는 경향이 :
나는 뮤 너무 짧은 게시 무엇의 변형을 사용하는 경향이 :
INSERT INTO something_log SELECT NULL, s.* FROM something AS s WHERE s.id = 1;
한 테이블이 (로그 테이블에 자동 증가를 제외하고) 동일한 필드를 가지고, 다음이 잘 작동합니다.
나는 (데이터베이스 너무 익숙하지 않은 다른 프로그래머에 쉽게 생활에) 가능하면 저장 프로 시저를 사용하기 때문에,이 해결할 수있는 문제마다 다시 갈 필요 및 업데이트 절차의 문제는 테이블에 새 필드를 추가 할 수 있습니다.
또한 보장 당신이 즉시 데이터베이스 쿼리를 업데이트 할 필요없이 그들이 로그 테이블에 나타나는 시작 테이블에 새 필드를 추가하는 경우 (물론 명시 적으로 필드를 설정 일부를 제외하고)
경고 : 당신은 필드 순서 투숙 같은 ... 그렇지 않으면 당신은 이상한 버그를 받기 시작 수 있도록 동시에 두 테이블에 새로운 필드를 추가 할 수 있는지 확인하는 것이 좋습니다. 당신은 데이터베이스 인터페이스를 쓰는 유일한 사람이며, 당신은 매우 조심 다음이 잘 작동합니다. 그렇지 않으면 모든 필드를 이름에 충실.
참고 : 당신은 당신이하는 솔로 프로젝트에 참여하지 않는 제 생각에, 반드시 그 작업을 다른 사람이 당신의 스키마 변경으로 로그 문을 명시 적으로 모든 필드 이름을 나열에 충실하고 업데이트 할 필요가 없습니다. 이 바로 가기는 아마 특히 생산 시스템에 ... 장기적으로 두통이 발생할 수 있습니다 가치가 없다.
-
==============================
12.
INSERT INTO `dbMyDataBase`.`tblMyTable` ( `IdAutoincrement`, `Column2`, `Column3`, `Column4` ) SELECT NULL, `Column2`, `Column3`, 'CustomValue' AS Column4 FROM `dbMyDataBase`.`tblMyTable` WHERE `tblMyTable`.`Column2` = 'UniqueValueOfTheKey' ; /* mySQL 5.6 */
-
==============================
13.SQL에 원하는 행을 덤프 한 다음 다시 그것을 가져 생성 된 SQL, 적은 ID 열을 사용합니다.
SQL에 원하는 행을 덤프 한 다음 다시 그것을 가져 생성 된 SQL, 적은 ID 열을 사용합니다.
from https://stackoverflow.com/questions/9156340/how-to-copy-a-row-and-insert-in-same-table-with-a-autoincrement-field-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 선택 TOP X (또는 아래) MySQL의 숫자 값에 대한 백분율 (0) | 2020.05.14 |
---|---|
[SQL] 와일드 카드 검색 성능 (%%)를 향상 MYSQL (0) | 2020.05.14 |
[SQL] SQL 서버에 연결하기 위해 PHP를 사용하는 방법 (0) | 2020.05.14 |
[SQL] 포스트 그레스 컬럼에 데이터를 반환하지 않는 테이블을 반환하는 기능 (0) | 2020.05.14 |
[SQL] 삽입의 성능을 최대 SQL 속도? (0) | 2020.05.14 |