INSERT พร้อม SELECT


287

ฉันมีแบบสอบถามที่แทรกโดยใช้ตัวเลือก:

INSERT INTO courses (name, location, gid) 
            SELECT name, location, gid 
              FROM courses 
             WHERE cid = $cid

เป็นไปได้หรือไม่ที่จะเลือก "ชื่อที่ตั้ง" สำหรับการแทรกและตั้งค่า gid เป็นอย่างอื่นในแบบสอบถาม

คำตอบ:


548

ใช่แน่นอน แต่ตรวจสอบไวยากรณ์ของคุณ

INSERT INTO courses (name, location, gid)
SELECT name, location, 1
FROM   courses
WHERE  cid = 2

คุณสามารถใส่ค่าคงที่ของประเภทเดียวกันกับgidที่ไม่ใช่แค่ 1 แน่นอน และฉันเพิ่งสร้างcidมูลค่า


2
ได้ผลขอบคุณมาก ด้วยการเลือกแทรกจะไม่ต้องใช้วงเล็บในชื่อฟิลด์ แต่เมื่อคุณเริ่มระบุค่าที่ด้านบนของตัวเลือกจะเห็นได้ว่าคุณต้องการ () รอบชื่อฟิลด์
Kyle

โปรดทราบว่าคุณไม่สามารถใช้นามแฝงในส่วนคำสั่งแทรก: "INSERT INTO course t1 (t1.name, t1.location, t1.gid) [... ] จะล้มเหลว
raphael

@ แอนดรูว์มีวิธีใดที่จะคืนค่าตัวเลือกเดียวกันโดยไม่เรียกใช้ตัวเลือกในครั้งต่อไปหรือไม่ ถ้าฉันต้องการแทรกและรับผลตารางเรียน
Taha SULTAN TEMURI

1
@ TAHASULTANTEMURI คำถามที่แตกต่าง แต่ถ้าฉันเข้าใจสิ่งที่คุณถาม SQL Server (ไม่ใช่สิ่งที่ถูกถาม แต่สิ่งที่ฉันใช้ในวันนี้) มีOUTPUTประโยคซึ่งช่วยให้คุณใส่สิ่งที่คุณแทรกลงในตารางอื่นด้วย ฉันไม่คิดว่า MySQL มีค่าเทียบเท่า คุณอาจสร้างตารางชั่วคราวเลือกลงในตารางนั้นจากนั้นเติมข้อมูลcoursesจากตารางนั้นจากนั้นใช้ตารางชั่วคราวสำหรับสิ่งที่คุณต้องการ
Andrew

31

ใช่แล้ว. คุณสามารถเขียน :

INSERT INTO courses (name, location, gid) 
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci

หรือคุณสามารถรับค่าจากการเข้าร่วมการเลือก ...


INSERT INTO ชื่อหลักสูตร, สถานที่, ชื่อ gid SELECT, สถานที่, '$ this-> gid' จากหลักสูตร WHERE cid = $ cid - ฉันได้รับข้อผิดพลาด: คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ; ตรวจสอบคู่มือที่สอดคล้องกับรุ่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องเพื่อใช้ใกล้ 'ชื่อ, สถานที่, ชื่อ gid SELECT, สถานที่,' 22 'จากหลักสูตร WHERE cid = 23' ที่บรรทัด 1
Kyle

ฉันเดาว่าฟิลด์ gid ของคุณเป็นจำนวนเต็มดังนั้น: '22' ต้องเป็น 22 เปลี่ยน '$ this-> gid' โดย $ this-> gid
Alex Reche Martinez

22 และ '22' ไม่ควรสำคัญกับ sql แต่ฉันใส่สตริงในกรณีที่ฟิลด์นั้นคล้ายกับตัวระบุที่ไม่ซ้ำกัน
Dumitrescu Bogdan

8

แก้ไขไวยากรณ์: การสะกดคำที่เลือกผิด

INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci 

5

แน่นอนว่าคุณต้องการใช้อะไรกับ gid? ค่าคงที่, PHP var, ...

ค่าคงที่ 1234 อาจเป็นเช่น:

INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid


1

แน่นอนคุณสามารถ.

สิ่งหนึ่งที่ควรสังเกตคือ: INSERT INTO SELECTคำสั่งคัดลอกข้อมูลจากตารางหนึ่งและแทรกลงในอีกตารางหนึ่งและกำหนดให้ชนิดข้อมูลในตารางต้นทางและเป้าหมายตรงกัน หากประเภทข้อมูลจากคอลัมน์ของตารางได้รับไม่ตรงกับ (คือพยายามที่จะแทรกVARCHARเข้าไปในINTหรือTINYINTเข้าINT) MySQL SQL Error (1366)เซิร์ฟเวอร์จะโยน

ดังนั้นระวัง

นี่คือไวยากรณ์ของคำสั่ง:

INSERT INTO table2 (column1, column2, column3)
SELECT column1, column2, column3 FROM table1
WHERE condition;

หมายเหตุด้านข้าง: มีวิธีหลีกเลี่ยงปัญหาการแทรกคอลัมน์ประเภทต่าง ๆ โดยใช้การคัดเลือกนักแสดงในSELECTตัวอย่างเช่น:

SELECT CAST('qwerty' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

การแปลงนี้ ( CAST()เป็นคำพ้องความหมายCONVERT()) มีประโยชน์มากหากตารางของคุณมีชุดอักขระที่แตกต่างกันในคอลัมน์ตารางเดียวกัน (ซึ่งอาจนำไปสู่การสูญเสียข้อมูลหากไม่ได้จัดการอย่างเหมาะสม)


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