[mysql] MySQL에서 자동 증가 필드를 사용하여 행을 복사하고 동일한 테이블에 삽입하는 방법은 무엇입니까?

MySQL의에서 나는있는 행을 복사하려고 자동 증가 column ID=1삽입 을 가진 새로운 행으로 같은 테이블에 데이터를 column ID=2.

단일 쿼리로 어떻게 할 수 있습니까?



답변

사용 INSERT ... SELECT:

insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1

c1, c2, ...제외한 모든 열은 어디에 있습니까 id? id를 2 로 명시 적으로 삽입하려면 INSERT 열 목록과 SELECT에 포함하십시오.

insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1

id물론 두 번째 경우에는 2 의 가능한 복제본 을 처리해야합니다.


답변

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;

av8n.com-SQL 레코드 복제 방법 도 참조하십시오.

혜택:

  • SQL 문 2는 복제 프로세스 중에 변경해야하는 필드 만 언급합니다. 그들은 다른 분야에 대해 알지 못하거나 걱정하지 않습니다. 다른 필드는 변경없이 그대로갑니다. 이는 SQL 문 작성, 읽기, 유지 보수 및 확장 성을 향상시킵니다.
  • 일반적인 MySQL 문만 사용됩니다. 다른 도구 나 프로그래밍 언어는 필요하지 않습니다.
  • your_table번의 원자 조작으로 완전히 올바른 레코드가 삽입됩니다 .

답변

테이블이이라고 가정하십시오 user(id, user_name, user_email).

이 쿼리를 사용할 수 있습니다 :

INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)


답변

이것은 도움이되었으며 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;


답변

열 이름을 지정할 필요가없는 빠르고 깨끗한 솔루션을 위해 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

면책 조항 :이 솔루션은 많은 테이블에서 행을 반복적으로 복제하는 사람에게만 적합합니다. 불량 사용자의 손에 위험 할 수 있습니다.


답변

열을 자동 증가시킬 값으로 ‘0’을 전달할 수도 있습니다. 레코드가 작성 될 때 올바른 값이 사용됩니다. 이것은 임시 테이블보다 훨씬 쉽습니다.

출처 :
MySQL에서 행 복사
(TRiG의 첫 번째 솔루션에 대한 Lore의 두 번째 주석 참조)


답변

여기에 많은 훌륭한 답변이 있습니다. 다음은 개발중인 웹 응용 프로그램에 대해이 작업을 수행하기 위해 작성한 저장 프로 시저 샘플입니다.

-- 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