ใน MySQL ฉันพยายามที่จะคัดลอกแถวที่มีautoincrement column ID=1
และใส่column ID=2
ข้อมูลลงในตารางเดียวกันเป็นแถวใหม่ที่มี
ฉันจะทำสิ่งนี้ในแบบสอบถามเดียวได้อย่างไร
ใน MySQL ฉันพยายามที่จะคัดลอกแถวที่มีautoincrement 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
ประโยชน์ที่ได้รับ:
your_table
การดำเนินการอะตอมมิกเดียวError Code: 1113. A table must have at least 1 column
ฉันได้รับ
SET id=NULL
Column 'id' cannot be null
ควรแทนที่ด้วยUPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
user(id, user_name, user_email)
บอกว่าตารางเป็น
คุณสามารถใช้แบบสอบถามนี้:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
Result: near "SELECT": syntax error
สิ่งนี้ช่วยและสนับสนุนคอลัมน์ 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 เพื่อแก้ปัญหาแรกโดยตำนาน)
คำตอบที่ดีมากมายที่นี่ ด้านล่างนี้เป็นตัวอย่างของกระบวนงานที่เก็บไว้ที่ฉันเขียนเพื่อทำงานนี้ให้สำเร็จสำหรับ Web App ที่ฉันกำลังพัฒนา:
-- 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
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
หากคุณสามารถใช้ MySQL Workbench คุณสามารถทำได้โดยคลิกขวาที่แถวและเลือก 'คัดลอกแถว' จากนั้นคลิกขวาที่แถวว่างแล้วเลือก 'วางแถว' จากนั้นเปลี่ยน ID แล้ว คลิก 'สมัคร'
คัดลอกแถว:
วางแถวที่คัดลอกลงในแถวว่าง:
เปลี่ยน 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);
ฉันมักจะใช้รูปแบบของสิ่งที่ mu โพสต์สั้นเกินไป:
INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;
ตราบใดที่ตารางมีเขตข้อมูลที่เหมือนกัน (ยกเว้นการเพิ่มอัตโนมัติในตารางบันทึก) จากนั้นก็ใช้งานได้ดี
เนื่องจากฉันใช้โพรซีเดอร์ที่เก็บไว้เมื่อใดก็ตามที่เป็นไปได้ (เพื่อทำให้ชีวิตง่ายขึ้นสำหรับโปรแกรมเมอร์คนอื่น ๆ ที่ไม่คุ้นเคยกับฐานข้อมูล) สิ่งนี้แก้ปัญหาการกลับไปและอัปเดตโพรซีเดอร์ทุกครั้งที่คุณเพิ่มฟิลด์ใหม่ลงในตาราง
นอกจากนี้ยังช่วยให้มั่นใจว่าถ้าคุณเพิ่มเขตข้อมูลใหม่ลงในตารางพวกเขาจะเริ่มปรากฏในตารางบันทึกทันทีโดยไม่ต้องอัปเดตฐานข้อมูลแบบสอบถามของคุณ (เว้นแต่แน่นอนว่าคุณมีบางส่วนที่ตั้งค่าเขตข้อมูลไว้อย่างชัดเจน)
คำเตือน:คุณจะต้องแน่ใจว่าได้เพิ่มเขตข้อมูลใหม่ใด ๆ ลงในทั้งสองตารางในเวลาเดียวกันเพื่อให้คำสั่งฟิลด์ยังคงเหมือนเดิม ... มิฉะนั้นคุณจะเริ่มได้รับข้อผิดพลาดแปลก ๆ หากคุณเป็นคนเดียวที่เขียนอินเทอร์เฟซฐานข้อมูลและคุณก็ระวังให้ดี มิฉะนั้นให้ตั้งชื่อฟิลด์ทั้งหมดของคุณ
หมายเหตุ:ในความคิดที่สองเว้นแต่ว่าคุณกำลังทำงานในโครงการเดี่ยวที่คุณแน่ใจว่าจะไม่มีคนอื่นที่ทำงานในนั้นติดอยู่กับรายชื่อชื่อฟิลด์ทั้งหมดอย่างชัดเจนและอัปเดตคำสั่งบันทึกของคุณเมื่อสคีมาของคุณมีการเปลี่ยนแปลง ทางลัดนี้อาจไม่คุ้มค่ากับอาการปวดหัวในระยะยาวซึ่งอาจเป็นสาเหตุ ... โดยเฉพาะในระบบการผลิต
ใส่ลงใน "dbMyDataBase". "tblMyTable" ( `IdAutoincrement`, `Column2`, `Column3`, `Column4` ) เลือก โมฆะ `Column2`, `Column3`, 'CustomValue' เป็นคอลัมน์ 4 จาก "dbMyDataBase" .tblMyTable` WHERE `tblMyTable '.Column2` =' UniqueValueOfTheKey ' ; / * mySQL 5.6 * /
ดัมพ์แถวที่คุณต้องการ sql จากนั้นใช้ SQL ที่สร้างขึ้นหักคอลัมน์ ID เพื่ออิมพอร์ตกลับ