source

동일한 MySQL 테이블의 레코드 복제/복사

factcode 2022. 9. 27. 23:47
반응형

동일한 MySQL 테이블의 레코드 복제/복사

나는 한참을 찾고 있지만 내 문제에 대한 쉬운 해결책을 찾을 수 없다.테이블에 레코드를 복제하고 싶은데, 물론 고유 프라이머리 키를 업데이트해야 합니다.

질문이 있습니다.

INSERT INTO invoices
    SELECT * FROM invoices AS iv WHERE iv.ID=XXXXX
    ON DUPLICATE KEY UPDATE ID = (SELECT MAX(ID)+1 FROM invoices)

문제는 이것이 단지 우리의 삶을 변화시킨다는 것이다.ID행을 복사하는 대신 행의 이름을 지정합니다.이거 고칠 줄 아는 사람 있어요?

//edit: 필드 이름은 시간이 지남에 따라 변경될 수 있으므로 모든 필드 이름을 입력하지 않고 이 작업을 수행합니다.

제가 평소에 하는 방법은 임시 테이블을 사용하는 것입니다.계산은 잘 안 될 것 같은데 잘 되는 것 같아!여기 레코드 99 전체를 복제해서 레코드 100을 만들고 있습니다.

CREATE TEMPORARY TABLE tmp SELECT * FROM invoices WHERE id = 99;

UPDATE tmp SET id=100 WHERE id = 99;

INSERT INTO invoices SELECT * FROM tmp WHERE id = 100;

잘 됐으면 좋겠네요!

Alex의 답변은 여러 클라이언트 환경에서 주의할 필요가 있습니다(잠금이나 트랜잭션 등).

를 전제로 합니다.AUTO IDfield는 테이블의 첫 번째 필드입니다(통상적인 경우). 암묵적인 트랜잭션을 사용할 수 있습니다.

임시 테이블 tmp 작성 청구서에서 *를 선택하십시오.;ALTER TABLE tmp drop ID; # drop auto increment 필드# TMP SET 업데이트...; # 다른 고유 키만 변경하면 됨송장에 삽입 TMP에서 0,tmp.*를 선택합니다.드롭 테이블 tmp;

MySQL 문서:

AUTO_INCREMENT 사용: 열에 NULL 또는 0을 명시적으로 할당하여 시퀀스 번호를 생성할 수도 있습니다.

늦은 답변은 알고 있지만 여전히 흔한 질문입니다. 한 줄만 사용하여 효과가 있었다는 답변을 하나 더 추가하고 싶습니다.insert into스테이트먼트, 그리고 그것은 새로운 테이블을 작성하지 않고 간단하다고 생각합니다(그것은 문제가 될 수 있기 때문입니다).CREATE TEMPORARY TABLE권한):

INSERT INTO invoices (col_1, col_2, col_3, ... etc)
  SELECT
    t.col_1,
    t.col_2,
    t.col_3,
    ...
    t.updated_date,
  FROM invoices t;

솔루션은 다음과 같은 경우에 유효합니다.AUTO_INCREMENTid 컬럼을 추가할 수 있습니다.ID컬럼과 스테이트먼트:

INSERT INTO invoices (ID, col_1, col_2, col_3, ... etc)
  SELECT
    MAX(ID)+1,
    t.col_1,
    t.col_2,
    t.col_3,
    ... etc ,
  FROM invoices t;

이 방법은 매우 쉽고 간단합니다.나중에 두 번째 업데이트 스테이트먼트를 사용하지 않고 한 줄에 다른 모든 것을 업데이트할 수 있습니다(예: 제목 컬럼을 추가 텍스트로 업데이트하거나 문자열을 다른 텍스트로 교체). 또한 복제하려는 항목을 정확하게 지정할 수 있습니다.복제하고 싶은 항목이 모두 있는 경우, 다른 항목이 있는 경우 그렇게 할 수 있습니다.

DUPLICE KEY가 트리거되므로 MAX(ID)+1을 미리 선택할 수 있습니다.

INSERT INTO invoices SELECT MAX(ID)+1, ... other fields ... FROM invoices AS iv WHERE iv.ID=XXXXX 

방법은 좋지만 필드 이름을 입력하는 대신 "*"를 사용하는 것이 문제입니다.primary key를 초과하는 모든 컬럼 이름을 입력하면 스크립트는 하나 또는 여러 레코드에서 매력적으로 작동합니다.

INSERT INTO invoices (iv.field_name, iv.field_name,iv.field_name
) SELECT iv.field_name, iv.field_name,iv.field_name FROM invoices AS iv     
WHERE iv.ID=XXXXX

Alex의 훌륭한 답변을 연장해서 만약 당신이 전체 레코드를 복제하고 싶다면 적절한 답변을 하고 싶었을 뿐입니다.

SET @x=7;
CREATE TEMPORARY TABLE tmp SELECT * FROM invoices;
UPDATE tmp SET id=id+@x;
INSERT INTO invoices SELECT * FROM tmp;

나는 이것을 해야만 했고 알렉스의 대답이 완벽한 출발점이라는 것을 알았다.물론 테이블에서 가장 높은 행 번호로 @x를 설정해야 합니다(쿼리로 얻을 수 있을 것입니다).이 기능은 이 매우 구체적인 상황에서만 유용하므로 모든 행을 복제하지 않을 때 사용하십시오.필요에 따라 계산을 조정합니다.

저도 비슷한 문제가 있는데, 제가 하고 있는 일은 다음과 같습니다.

insert into Preguntas  (`EncuestaID`, `Tipo` , `Seccion` , `RespuestaID` , `Texto` )  select '23', `Tipo`, `Seccion`, `RespuestaID`, `Texto` from Preguntas where `EncuestaID`= 18

프리건타스:

CREATE TABLE IF NOT EXISTS `Preguntas` (
  `ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `EncuestaID` int(11) DEFAULT NULL,
  `Tipo` char(5) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Seccion` int(11) DEFAULT NULL,
  `RespuestaID` bigint(11) DEFAULT NULL,
  `Texto` text COLLATE utf8_unicode_ci ,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=522 ;

그...ID는 고정값EncuestaID.

이것도 필요했습니다.제 솔루션은 SQLYOG(무료 버전)를 사용하여 원하는 레코드를 SQL로 내보내는 것이었습니다(인서트 작성).

이 ID를 자동으로 생성해야 하므로 수동으로 편집하여 ID를 삭제하고 SQLYog에 삽입물을 복사하여 실행했습니다.이것은 고통스럽지 않았다.다른 MySQL GUI에서도 이 기능을 사용할 수 있습니다.

그러면 라이브 시스템에서 테스트 목적으로 사용할 수 있는 레코드가 제공됩니다.

테이블이 매일 다시 작성되기 때문에 이 인서트도 재사용할 수 있게 되었습니다.

약간의 변화입니다.주요 차이점은 프라이머리 키필드("varname")를 null로 설정하는 것입니다.이것은 경고를 발생시키지만 동작합니다.프라이머리 키를 null로 설정하면 마지막 스테이트먼트에 레코드를 삽입할 때 자동 인크리먼트가 동작합니다.

이 코드는 이전 시도도 정리하여 문제 없이 여러 번 실행할 수 있습니다.

DELETE FROM `tbl` WHERE varname="primary key value for new record";
DROP TABLE tmp;
CREATE TEMPORARY TABLE tmp SELECT * FROM `tbl` WHERE varname="primary key value for old record";
UPDATE tmp SET varname=NULL;
INSERT INTO `tbl` SELECT * FROM tmp;

임시 테이블을 변경하여 NOT NULL 요건 없이 ID 필드를 bigint 등으로 변경한 후 해당 임시 테이블에서 ID를 0으로 설정할 수 있습니다.그런 다음 이 값을 원래 테이블에 다시 추가하면 NULL이 자동 증가를 트리거합니다.

CREATE TEMPORARY TABLE tmptable SELECT * FROM x WHERE (id='123');
ALTER TABLE tmptable CHANGE id id bigint;
UPDATE tmptable SET id = NULL;
INSERT INTO x SELECT * FROM tmptable;

언급URL : https://stackoverflow.com/questions/729489/duplicate-copy-records-in-the-same-mysql-table

반응형