ใส่ลงใน ... เลือกสำหรับคอลัมน์ MySQL ทั้งหมด


119

ฉันกำลังพยายามย้ายข้อมูลเก่าจาก:

this_table >> this_table_archive

คัดลอกคอลัมน์ทั้งหมด ฉันได้ลองแล้ว แต่ไม่ได้ผล:

INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00');

หมายเหตุ: ตารางจะเหมือนกันและถูกidกำหนดให้เป็นคีย์หลัก


1
กำหนด "มันใช้ไม่ได้" ฉันมีปัญหาที่อาจจะคล้ายกัน แต่บอกไม่ได้เพราะคุณไม่ได้บอกว่าปัญหาของคุณคืออะไร !!
Lightness Races ใน Orbit

มันไม่พังมันก็ใช้ไม่ได้
Webmaster G

ดูเพิ่มเติมที่นี่/programming/3709560/joining-three-tables-using-mysql

คำตอบ:


218

ไวยากรณ์ที่ถูกต้องอธิบายไว้ในคู่มือ ลองสิ่งนี้:

INSERT INTO this_table_archive (col1, col2, ..., coln)
SELECT col1, col2, ..., coln
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00';

หากคอลัมน์ id เป็นคอลัมน์ที่เพิ่มขึ้นอัตโนมัติและคุณมีข้อมูลบางส่วนในทั้งสองตารางแล้วในบางกรณีคุณอาจต้องการละเว้น id จากรายการคอลัมน์และสร้างรหัสใหม่แทนเพื่อหลีกเลี่ยงการแทรก id ที่มีอยู่แล้วในรายการเดิม ตาราง. หากตารางเป้าหมายของคุณว่างเปล่าก็จะไม่มีปัญหา


73

สำหรับไวยากรณ์จะมีลักษณะดังนี้ (เว้นรายการคอลัมน์ไว้โดยปริยายหมายถึง "ทั้งหมด")

INSERT INTO this_table_archive
SELECT *
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00'

เพื่อหลีกเลี่ยงข้อผิดพลาดของคีย์หลักหากคุณมีข้อมูลในตารางเก็บถาวร

INSERT INTO this_table_archive
SELECT t.*
FROM this_table t
LEFT JOIN this_table_archive a on a.id=t.id
WHERE t.entry_date < '2011-01-01 00:00:00'
  AND a.id is null  # does not yet exist in archive

6
+1 สำหรับการเข้าร่วมด้านซ้ายเพื่อหลีกเลี่ยงการชนคีย์หลัก
Hartley Brody

23

นอกเหนือจากคำตอบของ Mark Byers:

บางครั้งคุณต้องการแทรกรายละเอียดHardcodedอื่น ๆ อาจมีข้อ จำกัด ที่ไม่ซ้ำกันล้มเหลวเป็นต้นดังนั้นให้ใช้สิ่งต่อไปนี้ในสถานการณ์เช่นนี้ซึ่งคุณจะแทนที่ค่าบางส่วนของคอลัมน์

INSERT INTO matrimony_domain_details (domain, type, logo_path)
SELECT 'www.example.com', type, logo_path
FROM matrimony_domain_details
WHERE id = 367

ฉันเพิ่มมูลค่าโดเมนที่นี่ด้วยวิธี Hardcoded เพื่อกำจัดออกจากข้อ จำกัด เฉพาะ


4

คุณไม่ต้องการ double () สำหรับบิตค่าหรือไม่? ถ้าไม่ลองสิ่งนี้ (แม้ว่าจะต้องมีวิธีที่ดีกว่าก็ตาม

insert into this_table_archive (id, field_1, field_2, field_3) 
values
((select id from this_table where entry_date < '2001-01-01'), 
((select field_1 from this_table where entry_date < '2001-01-01'), 
((select field_2 from this_table where entry_date < '2001-01-01'), 
((select field_3 from this_table where entry_date < '2001-01-01'));

2
สหกรณ์จะใช้ไม่ได้INSERT INTO .. SELECT FROM INSERT INTO .. VALUESคุณสมบัติที่แตกต่างกัน
Lightness Races ใน Orbit

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.