행을 복사하고 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 후 과 SELECT2의 INSERT가 됩니다.
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
될 수 있으니 id두 번째
IMO에서는 sql 문을 사용하여 해당 행을 복사하는 동시에 변경해야 하는 열만 참조하는 것이 가장 좋습니다.
CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY
SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=0; /* 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
면책사항: 이 솔루션은 많은 테이블에서 행을 반복적으로 복제하는 사용자에게만 적용됩니다.악성 사용자의 손에 의해 위험할 수 있습니다.
MySQL Workbench를 사용할 수 있다면 행을 마우스 오른쪽 버튼으로 클릭하고 '행 복사'를 선택한 다음 빈 행을 마우스 오른쪽 버튼으로 클릭하고 '행 붙여넣기'를 선택한 다음 ID를 변경한 다음 '적용'을 클릭하면 됩니다.
행을 복사합니다.
복사한 행을 빈 행에 붙여넣습니다.
ID를 변경합니다.
적용:
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
좋은 답변들이 많네요.다음은 개발 중인 웹 앱에 대해 이 작업을 수행하기 위해 작성한 저장 프로시저의 예입니다.
-- 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
또한 자동 증분할 열의 값으로 '0'을 전달할 수 있습니다. 레코드가 생성될 때 올바른 값이 사용됩니다.이것은 임시 테이블보다 훨씬 쉽다.
출처: MySQL 행 복사(TRiG의 첫 번째 솔루션에 대한 두 번째 코멘트 참조)
나는 mu가 너무 짧은 투고를 변형한 것을 사용하는 경향이 있다.
INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;
테이블이 동일한 필드(로그 테이블의 자동 증분 제외)를 가지고 있는 한, 이것은 정상적으로 동작합니다.
가능한 한 스토어드 프로시저를 사용하기 때문에(데이터베이스에 익숙하지 않은 다른 프로그래머의 생활을 용이하게 하기 위해), 테이블에 새로운 필드를 추가할 때마다 프로시저를 갱신해야 하는 문제가 해결됩니다.
또한 테이블에 새 필드를 추가하면 데이터베이스 쿼리를 업데이트할 필요 없이 로그 테이블에 바로 나타납니다(물론 필드를 명시적으로 설정한 필드가 있는 경우를 제외).
경고:필드 순서가 동일하게 유지되도록 새 필드를 두 테이블에 동시에 추가해야 합니다.그렇지 않으면 이상한 버그가 생기기 시작합니다.데이터베이스 인터페이스를 쓰는 유일한 사용자가 매우 주의한다면 이 방법은 올바르게 작동합니다.그렇지 않으면 모든 필드의 이름을 지정합니다.
주의: 다시 한 번 생각해 봅시다.단, 다른 사람에게 맡기지 않는 한 모든 필드 이름을 명시적으로 나열하고 스키마가 변경되면 로그 문을 업데이트합니다.이 지름길은 아마도 그것이 야기할 수 있는 장기적인 골칫덩어리의 가치가 없을 것이다.특히 생산 시스템에 대해서는요.
dbMyDataBase에 삽입합니다.'tblMyTable'('IdAutoincrement','Column2','Column3','Column4)
선택한다.특수한 절차,'Column2','Column3','Custom Value' AS 열 4dbMyDataBase에서.'tblMyTable'여기서 'tblMyTable'입니다.'Column2' = 'Unique Value Of'키;/* mySQL 5.6 */같은 기능을 찾고 있었는데 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);
이것을 시험해 보세요.
INSERT INTO test_table (SELECT null,txt FROM test_table)
이 쿼리를 실행할 때마다 테이블에 새 ID. 값이 포함된 모든 행이 다시 삽입되고 기하급수적으로 증가합니다.
id와 txt의 두 열이 있는 테이블을 사용했는데 id는 auto increment입니다.
your_table(col1,col2,col3)에 삽입하여 your_table에서 col1+1,col2,col3를 선택합니다.여기서 col1=1;
주의: col1이 프라이머리 키일 경우 증분 후 col1의 새 값이 중복 엔트리가 아님을 확인합니다.
CREATE TEMPORARY TABLE IF NOT EXISTS `temp_table` LIKE source_table;
DELETE FROM `purchasing2` ;
INSERT INTO temp_table SELECT * FROM source_table where columnid = 2;
ALTER TABLE temp_table MODIFY id INT NOT NULL;
ALTER TABLE temp_table DROP PRIMARY KEY;
UPDATE temp_table SET id=NULL ;
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE IF EXISTS temp_table ;
SQL로 만들 행을 덤프한 다음 생성된 SQL을 사용하여 다시 가져올 ID 열을 줄입니다.
언급URL : https://stackoverflow.com/questions/9156340/how-to-copy-a-row-and-insert-in-same-table-with-a-autoincrement-field-in-mysql
'source' 카테고리의 다른 글
| 디버깅 정보를 사용하여 Python 오류를 기록하려면 어떻게 해야 합니까? (0) | 2022.12.24 |
|---|---|
| PHP foreach 루프 키 값 (0) | 2022.12.24 |
| 두 표의 점수를 비교하여 가장 최근의 점수가 다른 부분을 보여줍니다. (0) | 2022.12.24 |
| EX를 반환해야 합니까?IT_SUCCESS 또는 main()의 0? (0) | 2022.12.24 |
| Date Time 개체를 딥 복사하려면 어떻게 해야 합니까? (0) | 2022.12.24 |



