MySQL แทรกที่แบบสอบถาม


121

เกิดอะไรขึ้นกับข้อความค้นหานี้:

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

มันทำงานได้โดยไม่มีWHEREข้อ ดูเหมือนจะลืม SQL ไปแล้ว ..

คำตอบ:


237

MySQL INSERT Syntaxไม่รองรับ WHERE clause ดังนั้นการสืบค้นของคุณตามที่ย่อมาจะล้มเหลว สมมติว่าidคอลัมน์ของคุณไม่ซ้ำกันหรือคีย์หลัก:

หากคุณกำลังพยายามแทรกแถวใหม่ด้วย ID 1 คุณควรใช้:

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);

หากคุณกำลังพยายามเปลี่ยนน้ำหนัก / ค่าน้ำหนักที่ต้องการสำหรับแถวที่มีอยู่ด้วย ID 1 คุณควรใช้:

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;

หากคุณต้องการคุณยังสามารถใช้ INSERT .. ON DUPLICATE KEY syntax ดังนี้:

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

หรือเป็นเช่นนั้น:

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

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


1
ขอบคุณสำหรับคำตอบที่ดี เมื่อใช้แบบสอบถาม UPDATE มันทำงานได้ดี แต่เมื่อ id เป็นคีย์หลักและคีย์การเพิ่มอัตโนมัติคำสั่ง INSERT ข้างต้นจะไม่ทำงานข้อผิดพลาดรายการซ้ำ '1' สำหรับคีย์ 1
JDGuide

1
@JDeveloper นั่นเป็นเพราะแถวนั้นมีอยู่แล้ว ดังที่ชาดกล่าวถึงIf you're trying to insert a new row with ID 1 you should be usingINSERT INTO ในกรณีของคุณคุณกำลังพยายามแทรกเมื่อมี ID 1 อยู่แล้วและเป็นคีย์หลักหรือคีย์ที่ไม่ซ้ำกันและล้มเหลวดังนั้นคุณควรใช้ไวยากรณ์ UPDATE หรือ INSERT .. บนไวยากรณ์ DUPLICATE KEY
Anthony Hatzopoulos

41

คุณไม่สามารถรวม WHERE clause กับ VALUES clause คุณมีสองทางเลือกเท่าที่ฉันทราบ -

  1. INSERT ระบุค่า

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. แทรกโดยใช้คำสั่ง SELECT

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1

19

คุณใช้คำสั่ง WHERE สำหรับการสอบถาม UPDATE เมื่อคุณแทรกคุณจะสมมติว่าไม่มีแถวนั้น

จากนั้นคำสั่งของ OP จะกลายเป็น;

ผู้ใช้อัปเดตน้ำหนัก SET = 160, น้ำหนักที่ต้องการ = 45 โดยที่ id = 1;

ใน MySQL หากคุณต้องการแทรกหรืออัปเดตคุณสามารถใช้แบบสอบถามแทนที่ด้วยคำสั่ง WHERE ถ้า WHERE ไม่มีอยู่มันจะแทรกเข้ามามิฉะนั้นจะอัปเดต

แก้ไข

ฉันคิดว่าประเด็นของ Bill Karwin มีความสำคัญมากพอที่จะดึงความคิดเห็นออกมาและทำให้มันชัดเจนมาก ขอบคุณ Bill มันนานเกินไปแล้วที่ฉันทำงานกับ MySQL ฉันจำได้ว่าฉันมีปัญหากับ REPLACE แต่ฉันลืมไปแล้วว่ามันคืออะไร ฉันควรจะมองมันขึ้นมา

นั่นไม่ใช่วิธีการทำงานของ REPLACE ของ MySQL มันทำการ DELETE (ซึ่งอาจเป็น no-op ถ้าแถวนั้นไม่มีอยู่) ตามด้วย INSERT คิดถึงผลที่ตามมา ทริกเกอร์และการอ้างอิงคีย์ต่างประเทศ ให้ใช้ INSERT ... ON DUPLICATE KEY UPDATE แทน


7
นั่นไม่ใช่วิธีการทำงานของ REPLACE ของ MySQL มันทำการ DELETE (ซึ่งอาจเป็น no-op ถ้าแถวนั้นไม่มีอยู่) ตามด้วย INSERT คิดถึงผลที่ตามมา ทริกเกอร์และการอ้างอิงคีย์ต่างประเทศ ให้ใช้ INSERT ... ON DUPLICATE KEY UPDATE แทน
Bill Karwin


5

แทรกคำค้นหาไม่รองรับที่ที่คำหลัก *

ใช้เงื่อนไขเนื่องจากคุณสามารถใช้เงื่อนไขสำหรับคำสั่งย่อยที่เลือกได้ คุณสามารถทำการแทรกที่ซับซ้อนได้โดยใช้การเลือกย่อย

ตัวอย่างเช่น:

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';

ด้วยการวาง "เลือก" ในคำสั่งแทรกคุณสามารถทำการแทรกทวีคูณได้อย่างรวดเร็ว

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

SELECT count(*)
FROM customers
WHERE city = 'Newark';

คุณสามารถตรวจสอบให้แน่ใจว่าไม่ได้แทรกข้อมูลที่ซ้ำกันโดยใช้เงื่อนไข EXISTS

ตัวอย่างเช่นหากคุณมีตารางชื่อไคลเอนต์ที่มีคีย์หลักเป็น client_id คุณสามารถใช้คำสั่งต่อไปนี้:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

คำสั่งนี้แทรกหลายระเบียนโดยมีการเลือกย่อย

หากคุณต้องการแทรกระเบียนเดียวคุณสามารถใช้คำสั่งต่อไปนี้:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

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

ดูวิธีแทรกด้วย where clause


4

คำตอบที่ถูกต้องสำหรับคำถามนี้จะเป็นดังนี้:

ก) หากต้องการเลือกก่อนแทรก:

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;

ข) หากมีระเบียน IF อยู่แล้วให้ใช้การอัปเดตแทนการแทรก:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

ควรจะเป็น

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

ค). หากต้องการอัปเดตหรือแทรกในเวลาเดียวกัน

Replace Users set weight=160, desiredWeight=145  WHERE id = 1;

Note):- you should provide values to all fields else missed field in query 
        will be set to null

ง) หากคุณต้องการโคลนบันทึกจากตารางเดียวกันโปรดจำไว้ว่าคุณไม่สามารถเลือกจากตารางที่คุณกำลังแทรกได้

 create temporary table xtable ( weight int(11), desiredWeight int(11) ;

 insert into xtable (weight, desiredWeight) 
    select weight, desiredWeight from Users where [condition]

 insert into Users (weight, desiredWeight) 
    select weight , desiredWeight from xtable;

ฉันคิดว่าสิ่งนี้ครอบคลุมสถานการณ์ส่วนใหญ่


3

คุณไม่สามารถใช้ WHERE เมื่อทำคำสั่ง INSERT:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

ควรจะเป็น:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );

ส่วน WHERE ทำงานในคำสั่ง SELECT เท่านั้น:

SELECT from Users WHERE id = 1;

หรือในคำสั่ง UPDATE:

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;

2

แทรกลงใน = การเพิ่มแถวในตาราง

Upate = อัพเดตเฉพาะแถว

ประโยค Where จะอธิบายอะไรในส่วนแทรกของคุณ? มันไม่มีอะไรที่ตรงกันไม่มีแถว (ยัง) ...


2

คุณสามารถทำการ INSERT แบบมีเงื่อนไขตามการป้อนข้อมูลของผู้ใช้ แบบสอบถามนี้จะแทรกเฉพาะเมื่ออินพุต vars '$ userWeight' และ '$ userDesiredWeight' ไม่ว่างเปล่า

INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1

มันขึ้นอยู่กับสถานการณ์ INSERT สามารถมีประโยค where ได้

ตัวอย่างเช่นถ้าคุณจับคู่ค่าจากฟอร์ม

Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com

สมเหตุสมผลหรือไม่?


เป็นไปได้หรือไม่ที่ประโยคในคำสั่งแทรก
Taja_100

1

วิธีที่ง่ายที่สุดคือใช้ IF เพื่อละเมิดข้อ จำกัด สำคัญของคุณ สิ่งนี้ใช้ได้กับ INSERT IGNORE เท่านั้น แต่จะอนุญาตให้คุณใช้ข้อ จำกัด ใน INSERT

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');

1

หลังจากWHEREคำสั่งคุณวางเงื่อนไขและใช้สำหรับการดึงข้อมูลหรืออัปเดตแถว เมื่อคุณกำลังแทรกข้อมูลจะถือว่าไม่มีแถวนั้น

คำถามคือมีแถวใดบ้างที่ id เป็น 1? ถ้าเป็นเช่นนั้นใช้MySQL UPDATEอื่นใช้MySQL INSERT


1

หากคุณกำลังระบุหมายเลขระเบียนเฉพาะสำหรับการแทรกข้อมูลควรใช้UPDATEคำสั่งแทนINSERTคำสั่งดีกว่า

แบบสอบถามประเภทนี้ที่คุณเขียนในคำถามก็เหมือนกับแบบสอบถามหลอกๆ

คำถามของคุณคือ: -

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

ที่นี่คุณกำลังระบุ id = 1 ดังนั้นคุณควรใช้UPDATEคำสั่งในการอัปเดตเรกคอร์ดที่มีอยู่จะดีกว่าไม่แนะนำให้ใช้WHEREอนุประโยคในกรณีของINSERTคุณควรใช้UPDATEเตอร์คุณควรใช้

ตอนนี้ใช้การสอบถามการอัปเดต: -

UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;

ไม่มี mate.1st query จะไม่ทำงานคำถามที่ 1 คือคำถามที่ถาม
JDGuide

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

1

WHERE-clause สามารถใช้กับ INSERT-INTO-VALUES ได้จริงหรือไม่?

คำตอบคือไม่แน่นอน

การเพิ่มคำสั่ง WHERE หลังจาก INSERT INTO ... VALUES ... เป็นเพียง SQL ที่ไม่ถูกต้องและจะไม่แยกวิเคราะห์

ข้อผิดพลาดที่ส่งคืนโดย MySQL คือ:

mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1

ส่วนที่สำคัญที่สุดของข้อความแสดงข้อผิดพลาดคือ

... syntax to use near 'WHERE id = 1' ...

ซึ่งแสดงส่วนเฉพาะที่ตัวแยกวิเคราะห์ไม่คาดว่าจะพบที่นี่: คำสั่ง WHERE


1

มันผิดทั้งหมด INSERT QUERY ไม่มี WHERE clause มีเพียง UPDATE QUERY เท่านั้นที่มี หากคุณต้องการเพิ่มข้อมูลโดยที่ id = 1 Query ของคุณจะเป็น

UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;

1

ไม่เท่าที่ฉันทราบคุณไม่สามารถเพิ่มส่วนคำสั่ง WHERE ในแบบสอบถามนี้ได้ บางทีฉันอาจลืม SQL ไปด้วยเพราะฉันไม่แน่ใจจริงๆว่าทำไมคุณถึงต้องการมันต่อไป


1

คุณไม่ควรใช้เงื่อนไขที่ในคำสั่งแทรก หากคุณต้องการทำให้ใช้ insert ในคำสั่ง update แล้วอัพเดตเรกคอร์ดที่มีอยู่

ฉันจะรู้ได้อย่างไรว่าทำไมคุณถึงต้องการ where clause ในคำสั่ง Insert ??

อาจจะขึ้นอยู่กับเหตุผลที่ฉันอาจแนะนำตัวเลือกที่ดีกว่าให้คุณ


1

ฉันคิดว่าตัวเลือกที่ดีที่สุดของคุณคือใช้ REPLACE แทน INSERT

แทนที่ผู้ใช้ (id, น้ำหนัก, น้ำหนักที่ต้องการ) VALUES (1, 160, 145);


1

โปรดอ่านสิ่งนี้ด้วย

มันไม่สมเหตุสมผล ...

INSERTหมายถึงเพิ่มnew rowและเมื่อคุณบอกว่าWHEREคุณกำหนดแถวที่คุณกำลังพูดถึงในไฟล์SQL.

ดังนั้นการเพิ่มแถวใหม่จึงไม่สามารถทำได้ด้วยเงื่อนไขบนแถวที่มีอยู่

คุณต้องเลือกจากสิ่งต่อไปนี้:

ก. ใช้UPDATEแทนINSERT

B. ใช้INSERTและลบWHEREอนุประโยค (ฉันแค่บอกว่า ... ) หรือถ้าคุณมีข้อผูกมัดในการใช้งานจริงINSERTและWHEREในคำสั่งเดียวสามารถทำได้ผ่านINSERTเท่านั้น...

INSERT INTO Users( weight, desiredWeight ) 
SELECT FROM Users WHERE id = 1;

แต่สิ่งนี้มีจุดประสงค์ที่แตกต่างกันอย่างสิ้นเชิงและหากคุณกำหนด id เป็นคีย์หลักการแทรกนี้จะล้มเหลวมิฉะนั้นแถวใหม่จะถูกแทรกด้วย id = 1


ใช่คุณถูกต้องรู้ว่าสิ่งเหล่านี้ทั้งหมดตื่นขึ้นมาผิดพลาด
Asesha George

1

ฉันทราบว่านี่เป็นโพสต์เก่า แต่ฉันหวังว่าสิ่งนี้จะยังช่วยใครบางคนได้โดยสิ่งที่ฉันหวังเป็นตัวอย่างง่ายๆ:

พื้นหลัง:

ฉันมีหลายกรณี: ผู้ใช้รายเดียวกันแสดงรายการหลายครั้งโดยมีค่าหลายค่าและฉันต้องการสร้างระเบียนใหม่ดังนั้นการอัปเดตจึงไม่สมเหตุสมผลในกรณีของฉันและฉันจำเป็นต้องจัดการกับผู้ใช้เฉพาะอย่างที่ฉันทำ โดยใช้คำสั่ง WHERE

INSERT into MyTable(aUser,aCar)
value(User123,Mini)

ด้วยการใช้โครงสร้างนี้คุณจะกำหนดเป้าหมายผู้ใช้เฉพาะ (user123 ซึ่งมีระเบียนอื่น ๆ ) ดังนั้นคุณจึงไม่ต้องการคำสั่ง where จริงๆฉันคิดว่า

ผลลัพธ์อาจเป็น:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

1

วิธีการใช้ INSERT และ WHERE คือ

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); ในกรณีนี้ไม่เหมือนกับการทดสอบที่มีอยู่ ไม่มีข้อยกเว้นถ้าคุณเรียกใช้สองครั้งขึ้นไป ...


0

ไวยากรณ์ที่ถูกต้องสำหรับ mysql แทรกในคำสั่งโดยใช้วิธีการโพสต์คือ:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";

1
คุณจำเป็นต้องหลบหนีพารามิเตอร์ที่ไม่น่าเชื่อถือเช่นชื่อผู้ใช้หรือใช้แบบสอบถามเพื่อป้องกันไม่ให้ผู้บุกรุกจากการฉีด SQL คำสั่งโดยพลการ และใช้อัลกอริทึม HashCrypt เพื่อจัดเก็บรหัสผ่าน
Hendrik Brummermann


0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1
คุณสามารถแก้ไขคำตอบที่เสนอของคุณเพื่อขยายว่าสิ่งนี้ทำอะไรและจะจัดการกับ OP อย่างไร
Ro Yo Mi

0

คุณไม่สามารถใช้ INSERT และ WHERE ร่วมกันได้ คุณสามารถใช้คำสั่ง UPDATE เพื่อเพิ่มค่าให้กับคอลัมน์เฉพาะในฟิลด์เฉพาะเช่นโค้ดด้านล่าง

UPDATE Users
SET weight='160',desiredWeight ='145'  
WHERE id =1

0

ฉันคิดว่ารูปแบบที่ถูกต้องในการแทรกค่าในแถวระบุคือ:

UPDATE table SET column = value WHERE columnid = 1

มันใช้งานได้และคล้ายกันถ้าคุณเขียนบน Microsoft SQL Server

INSERT INTO table(column) VALUES (130) WHERE id = 1;

บน mysql คุณต้องอัปเดตตาราง


0

คุณสามารถทำได้โดยใช้รหัสด้านล่าง:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.