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


Answers

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 에 삽입됩니다.
Question

테이블 에그 탭이 있습니다. 내가 뭘 하려는지 자동 증가 열 ID = 1로 행을 복사하고 행 및 열 ID = 2와 동일한 테이블에 데이터를 삽입합니다.

MySql 사용하기. 어떻게 하나의 쿼리에서이 작업을 수행 할 수 있습니까?




열의 이름을 지정하지 않아도되는 빠르고 깨끗한 솔루션의 경우 여기에 설명 된대로 준비된 문을 사용할 수 있습니다. https://.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

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




SQL에 원하는 행을 덤프하고 생성 된 SQL을 사용하여 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);



또한 자동 증분 열의 값으로 '0'을 전달할 수 있으며 레코드가 생성 될 때 올바른 값이 사용됩니다. 이것은 임시 테이블보다 훨씬 쉽습니다.

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




Links