동일한 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 ID
field는 테이블의 첫 번째 필드입니다(통상적인 경우). 암묵적인 트랜잭션을 사용할 수 있습니다.
임시 테이블 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_INCREMENT
id 컬럼을 추가할 수 있습니다.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
'source' 카테고리의 다른 글
Junit - 1회 실행 셋업 방법 (0) | 2022.09.27 |
---|---|
Express/Node를 사용하여 404 응답을 프로그래밍 방식으로 전송하는 방법 (0) | 2022.09.27 |
Terraform을 사용하여 MariaDB 데이터베이스 덤프/복원 (0) | 2022.09.27 |
MySQL 명령줄을 사용하여 사용자 계정 목록을 가져오려면 어떻게 해야 합니까? (0) | 2022.09.27 |
대소문자를 구분하지 않는 검색 (0) | 2022.09.27 |