เกิดอะไรขึ้นกับข้อความค้นหานี้:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
มันทำงานได้โดยไม่มีWHERE
ข้อ ดูเหมือนจะลืม SQL ไปแล้ว ..
เกิดอะไรขึ้นกับข้อความค้นหานี้:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
มันทำงานได้โดยไม่มีWHERE
ข้อ ดูเหมือนจะลืม SQL ไปแล้ว ..
คำตอบ:
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 เพิ่มขึ้นตามปกติ
If you're trying to insert a new row with ID 1 you should be using
INSERT INTO ในกรณีของคุณคุณกำลังพยายามแทรกเมื่อมี ID 1 อยู่แล้วและเป็นคีย์หลักหรือคีย์ที่ไม่ซ้ำกันและล้มเหลวดังนั้นคุณควรใช้ไวยากรณ์ UPDATE หรือ INSERT .. บนไวยากรณ์ DUPLICATE KEY
คุณไม่สามารถรวม WHERE clause กับ VALUES clause คุณมีสองทางเลือกเท่าที่ฉันทราบ -
INSERT ระบุค่า
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
แทรกโดยใช้คำสั่ง SELECT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
คุณใช้คำสั่ง 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 แทน
ใช้เงื่อนไขเนื่องจากคุณสามารถใช้เงื่อนไขสำหรับคำสั่งย่อยที่เลือกได้ คุณสามารถทำการแทรกที่ซับซ้อนได้โดยใช้การเลือกย่อย
ตัวอย่างเช่น:
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);
การใช้ตารางคู่ช่วยให้คุณป้อนค่าของคุณในคำสั่งที่เลือกแม้ว่าปัจจุบันค่าจะไม่ได้ถูกเก็บไว้ในตารางก็ตาม
คำตอบที่ถูกต้องสำหรับคำถามนี้จะเป็นดังนี้:
ก) หากต้องการเลือกก่อนแทรก:
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;
ฉันคิดว่าสิ่งนี้ครอบคลุมสถานการณ์ส่วนใหญ่
คุณไม่สามารถใช้ 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;
แทรกลงใน = การเพิ่มแถวในตาราง
Upate = อัพเดตเฉพาะแถว
ประโยค Where จะอธิบายอะไรในส่วนแทรกของคุณ? มันไม่มีอะไรที่ตรงกันไม่มีแถว (ยัง) ...
คุณสามารถทำการ INSERT แบบมีเงื่อนไขตามการป้อนข้อมูลของผู้ใช้ แบบสอบถามนี้จะแทรกเฉพาะเมื่ออินพุต vars '$ userWeight' และ '$ userDesiredWeight' ไม่ว่างเปล่า
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
มันขึ้นอยู่กับสถานการณ์ 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
สมเหตุสมผลหรือไม่?
วิธีที่ง่ายที่สุดคือใช้ IF เพื่อละเมิดข้อ จำกัด สำคัญของคุณ สิ่งนี้ใช้ได้กับ INSERT IGNORE เท่านั้น แต่จะอนุญาตให้คุณใช้ข้อ จำกัด ใน INSERT
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
หลังจากWHERE
คำสั่งคุณวางเงื่อนไขและใช้สำหรับการดึงข้อมูลหรืออัปเดตแถว เมื่อคุณกำลังแทรกข้อมูลจะถือว่าไม่มีแถวนั้น
คำถามคือมีแถวใดบ้างที่ id เป็น 1? ถ้าเป็นเช่นนั้นใช้MySQL UPDATEอื่นใช้MySQL INSERT
หากคุณกำลังระบุหมายเลขระเบียนเฉพาะสำหรับการแทรกข้อมูลควรใช้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;
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
มันผิดทั้งหมด INSERT QUERY ไม่มี WHERE clause มีเพียง UPDATE QUERY เท่านั้นที่มี หากคุณต้องการเพิ่มข้อมูลโดยที่ id = 1 Query ของคุณจะเป็น
UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;
ไม่เท่าที่ฉันทราบคุณไม่สามารถเพิ่มส่วนคำสั่ง WHERE ในแบบสอบถามนี้ได้ บางทีฉันอาจลืม SQL ไปด้วยเพราะฉันไม่แน่ใจจริงๆว่าทำไมคุณถึงต้องการมันต่อไป
คุณไม่ควรใช้เงื่อนไขที่ในคำสั่งแทรก หากคุณต้องการทำให้ใช้ insert ในคำสั่ง update แล้วอัพเดตเรกคอร์ดที่มีอยู่
ฉันจะรู้ได้อย่างไรว่าทำไมคุณถึงต้องการ where clause ในคำสั่ง Insert ??
อาจจะขึ้นอยู่กับเหตุผลที่ฉันอาจแนะนำตัวเลือกที่ดีกว่าให้คุณ
ฉันคิดว่าตัวเลือกที่ดีที่สุดของคุณคือใช้ REPLACE แทน INSERT
แทนที่ผู้ใช้ (id, น้ำหนัก, น้ำหนักที่ต้องการ) VALUES (1, 160, 145);
มันไม่สมเหตุสมผล ...
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
ฉันทราบว่านี่เป็นโพสต์เก่า แต่ฉันหวังว่าสิ่งนี้จะยังช่วยใครบางคนได้โดยสิ่งที่ฉันหวังเป็นตัวอย่างง่ายๆ:
พื้นหลัง:
ฉันมีหลายกรณี: ผู้ใช้รายเดียวกันแสดงรายการหลายครั้งโดยมีค่าหลายค่าและฉันต้องการสร้างระเบียนใหม่ดังนั้นการอัปเดตจึงไม่สมเหตุสมผลในกรณีของฉันและฉันจำเป็นต้องจัดการกับผู้ใช้เฉพาะอย่างที่ฉันทำ โดยใช้คำสั่ง WHERE
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
ด้วยการใช้โครงสร้างนี้คุณจะกำหนดเป้าหมายผู้ใช้เฉพาะ (user123 ซึ่งมีระเบียนอื่น ๆ ) ดังนั้นคุณจึงไม่ต้องการคำสั่ง where จริงๆฉันคิดว่า
ผลลัพธ์อาจเป็น:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
วิธีการใช้ INSERT และ WHERE คือ
INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953);
ในกรณีนี้ไม่เหมือนกับการทดสอบที่มีอยู่ ไม่มีข้อยกเว้นถ้าคุณเรียกใช้สองครั้งขึ้นไป ...
ไวยากรณ์ที่ถูกต้องสำหรับ mysql แทรกในคำสั่งโดยใช้วิธีการโพสต์คือ:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
ฉันไม่คิดว่าเราสามารถใช้คำสั่ง where ในคำสั่งแทรกได้
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
คุณไม่สามารถใช้ INSERT และ WHERE ร่วมกันได้ คุณสามารถใช้คำสั่ง UPDATE เพื่อเพิ่มค่าให้กับคอลัมน์เฉพาะในฟิลด์เฉพาะเช่นโค้ดด้านล่าง
UPDATE Users
SET weight='160',desiredWeight ='145'
WHERE id =1
ฉันคิดว่ารูปแบบที่ถูกต้องในการแทรกค่าในแถวระบุคือ:
UPDATE table SET column = value WHERE columnid = 1
มันใช้งานได้และคล้ายกันถ้าคุณเขียนบน Microsoft SQL Server
INSERT INTO table(column) VALUES (130) WHERE id = 1;
บน mysql คุณต้องอัปเดตตาราง
คุณสามารถทำได้โดยใช้รหัสด้านล่าง:
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition