MySQL: วิธีการคัดลอกแถว แต่เปลี่ยนฟิลด์ไม่กี่?


195

ฉันมีแถวจำนวนมากที่ฉันต้องการคัดลอก แต่ฉันต้องเปลี่ยนหนึ่งฟิลด์

ฉันสามารถเลือกแถวที่ฉันต้องการคัดลอก:

select * from Table where Event_ID = "120"

ตอนนี้ผมต้องการที่จะคัดลอกแถวทั้งหมดเหล่านั้นและสร้างแถวใหม่ในขณะที่การตั้งค่าไปEvent_ID 155ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


279
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

ที่นี่ col2, ... แสดงถึงคอลัมน์ที่เหลือ (อันที่ไม่ใช่ Event_ID) ในตารางของคุณ


39
มีวิธีใดที่จะทำได้โดยไม่ต้องระบุชื่อคอลัมน์?
Andrew

4
ไม่ใช่ว่าฉันรู้ แน่นอนถ้าตารางของคุณมี 1,000 คอลัมน์หรือบางอย่างและคุณไม่ต้องการพิมพ์ทั้งหมดคุณสามารถเขียนคำสั่ง SQL เพื่อสร้างคำสั่ง SQL ของคุณได้ :) วิธีที่คุณจะทำคือใช้ data_schema เพื่อรับชื่อคอลัมน์สำหรับตาราง แต่นั่นมันเกินความจริงฉันแค่พิมพ์ชื่อคอลัมน์
dcp

3
สิ่งนี้จะเป็นไปได้หรือไม่ที่จะใช้เครื่องหมายดอกจันเพื่อรับคอลัมน์ที่เหลือ
ปีเตอร์

2
ลงชื่อเข้าใช้เพื่อโหวตเท่านั้นเพื่อทราบว่าฉันได้อัปเกรดแล้ว ฉันเดาว่านี่ช่วยฉันได้หลายครั้งแล้ว :) ขอบคุณ!
aexl

2
@Bitterblue - ขออภัยฉันไม่เข้าใจความคิดเห็นของคุณ ฉันไม่เคยพูด col2, ... เป็นคอลัมน์ที่คุณไม่ต้องการคัดลอกฉันแค่บอกว่ามันเป็นตัวแทนคอลัมน์ที่เหลือจากตาราง เห็นได้ชัดว่าพวกเขาจะถูกคัดลอกมิฉะนั้นพวกเขาจะไม่อยู่ในคำสั่ง SQL เลย
dcp

140

นี่เป็นวิธีแก้ปัญหาที่คุณมีหลายฟิลด์ในตารางของคุณและไม่ต้องการให้นิ้วเป็นตะคริวจากการพิมพ์ฟิลด์ทั้งหมดเพียงแค่พิมพ์ฟิลด์ที่ต้องการ :)

วิธีคัดลอกบางแถวลงในตารางเดียวกันโดยที่บางฟิลด์มีค่าแตกต่างกัน:

  1. สร้างตารางชั่วคราวพร้อมแถวทั้งหมดที่คุณต้องการคัดลอก
  2. อัพเดตแถวทั้งหมดในตารางชั่วคราวด้วยค่าที่คุณต้องการ
  3. หากคุณมีฟิลด์การเพิ่มอัตโนมัติคุณควรตั้งค่าเป็น NULL ในตารางชั่วคราว
  4. คัดลอกแถวทั้งหมดของตารางชั่วคราวลงในตารางต้นฉบับของคุณ
  5. ลบตารางชั่วคราว

รหัสของคุณ:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

รหัสสถานการณ์ทั่วไป:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

ประยุกต์ / รหัสย่อ:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

เนื่องจากการสร้างตารางชั่วคราวใช้TEMPORARYคำหลักมันจะถูกลบโดยอัตโนมัติเมื่อเซสชันเสร็จสิ้น (ตามที่แนะนำ @ ar34z)


7
MySQL รองรับTEMPORARYคำสำคัญเพื่อสร้างตารางชั่วคราว การใช้งานของCREATE TEMPORARY TABLEจะลดลงโดยอัตโนมัติตารางเมื่อเซสชั่น (ชุดของแบบสอบถาม SQL) เสร็จสิ้น การวางโต๊ะไม่จำเป็นและไม่ขัดแย้งกับตารางชั่วคราวอื่น ๆ ที่ใช้ชื่อเดียวกัน (เช่นเมื่อแฮ็คสด (ซึ่งฉันไม่แนะนำ))
ar34z

1
รหัสนี้ใช้งานได้เฉพาะถ้าคุณใช้ #temporary_table แทน temporary_table อาจเป็นปัญหา MSSQL หรือไม่
TruthOf42

16
สิ่งนี้ใช้งานได้อย่างสมบูรณ์แบบสำหรับฉัน แต่ฉันต้องเอาชนะข้อ จำกัด ของ Not Null ในคีย์หลักในตารางชั่วคราวที่ดูเหมือนว่าจะคัดลอกมาจากตารางเดิม ฉันแก้ไขสิ่งนี้โดยการเปลี่ยนตาราง temp ก่อนการอัพเดทดังนี้: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; จากนั้นการอัพเดทของคีย์หลักเป็น Null จะไม่ล้มเหลว
snorris

1
ฉันไม่สามารถได้รับมันในการทำงานใน PostgreSQL Exception: null value in column <auto_inc_not_null_field> violates not-null constraint9.4: ฉันลองALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000

1
ฉันทดสอบกับ MySQL และ MariaDB เวอร์ชันต่าง ๆ ทำงานได้สมบูรณ์แบบสำหรับฉันและฉันชอบรุ่นนี้กับคำตอบที่ยอมรับซึ่งจริง ๆ แล้วเกิดขึ้นบ่อยมากที่นี่ :)
hexerei software

41

สมมติว่าตารางของคุณมีอีกสองคอลัมน์: foo และ bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"

4
มีวิธีใดที่จะทำได้โดยไม่ต้องระบุชื่อคอลัมน์?
Andrew

@PeterBailey ใหม่ไปยัง MySQL คุณช่วยกรุณากำจัดแสงบางอย่างเกี่ยวกับวิธีการทำงานของรหัส: /
3kstc

10

หากคุณมีคอลัมน์จำนวนมากในตารางของคุณและไม่ต้องการพิมพ์แต่ละคอลัมน์คุณสามารถทำได้โดยใช้ตารางชั่วคราวเช่น

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
หมายเหตุ: นี่ถือว่าคุณไม่มีคีย์หลักในตารางของคุณ
kommradHomer

2

สวัสดีกำลังจะคัดลอกฟิลด์ทั้งหมดเปลี่ยนหนึ่งในนั้นเป็นค่า + อย่างอื่น

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????


0

ตราบใดที่ Event_ID เป็นจำนวนเต็มให้ทำดังนี้

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.