DROP IF EXISTS VS DROP?


163

บางคนบอกฉันได้ไหมว่ามีความแตกต่างระหว่างกันหรือไม่

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

ฉันถามสิ่งนี้เพราะฉันใช้เทมเพลต JDBC ในแอปพลิเคชันเว็บ MVC ของฉัน ถ้าฉันใช้DROP [TABLE_NAME]ข้อผิดพลาดกล่าวว่าตารางที่มีอยู่ และถ้าฉันใช้DROP IF EXISTS [TABLE_NAME]มันบอกว่าไวยากรณ์ SQL ไม่ดี มีใครช่วยได้บ้าง


1
หากคุณกำลังมองหาไวยากรณ์ของ SQL Server อยู่ที่นี่: stackoverflow.com/questions/7887011/…
Drew Delano

ฉันคิดว่าควรมีแท็กคำถามสำหรับฐานข้อมูลเฉพาะ
Tom Stickel

คำตอบ:


293

ไวยากรณ์ SQL มาตรฐานคือ

DROP TABLE table_name;

IF EXISTSไม่ได้มาตรฐาน แพลตฟอร์มที่ต่างกันอาจรองรับด้วยไวยากรณ์ที่แตกต่างกันหรือไม่สนับสนุนเลย ใน PostgreSQL ไวยากรณ์คือ

DROP TABLE IF EXISTS table_name;

คนแรกจะโยนข้อผิดพลาดถ้าไม่มีตารางหรือถ้าวัตถุฐานข้อมูลอื่นขึ้นอยู่กับมัน ส่วนใหญ่แล้ววัตถุฐานข้อมูลอื่นจะเป็นการอ้างอิงคีย์ต่างประเทศ แต่อาจมีวัตถุอื่นด้วย (ตัวอย่างเช่นมุมมอง) วินาทีที่สองจะไม่เกิดข้อผิดพลาดหากไม่มีตาราง แต่จะยังคงโยนข้อผิดพลาดหากวัตถุฐานข้อมูลอื่นขึ้นอยู่กับมัน

เมื่อต้องการวางตารางและวัตถุอื่น ๆ ทั้งหมดที่ขึ้นอยู่กับมันให้ใช้อย่างใดอย่างหนึ่งเหล่านี้

DROP TABLE table_name CASCADE;
DROP TABLE IF EXISTS table_name CASCADE;

ใช้เรียงซ้อนด้วยความระมัดระวัง


6
แค่คิดว่าฉันพูดถึงว่ามันจะเป็นความคิดที่ดีจริง ๆ สำหรับการใช้ภายในบล็อคธุรกรรม ( ... ) วิธีนี้เป็นที่ชัดเจนว่าฐานข้อมูลจะได้รับผลกระทบก่อนที่จะขัดขวางกลุ่มข้อมูลที่คุณอาจไม่ต้องการ CASCADEBEGINCOMMIT
jbowman

3
DROP IF EXISTS (ไม่มี CASCADE) จะถูกเพิ่มเข้าไปใน SQL Server 2016 ด้วยดูblogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…
Jovan MSFT

35

ไม่ใช่สิ่งที่ถูกถามโดยตรง แต่การหาวิธีการวางตารางอย่างถูกต้องฉันสะดุดคำถามนี้เพราะฉันเดาว่าคนอื่น ๆ ก็ทำเช่นกัน

จาก SQL Server 2016+ คุณสามารถใช้

DROP TABLE IF EXISTS dbo.Table

สำหรับ SQL Server <2016 สิ่งที่ฉันทำมีดังต่อไปนี้สำหรับตารางถาวร

IF OBJECT_ID('dbo.Table', 'U') IS NOT NULL 
  DROP TABLE dbo.Table; 

หรือนี่สำหรับตารางชั่วคราว

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 

17

คุณลืม tableไวยากรณ์ของคุณ:

drop table [table_name]

ซึ่งลดลงตาราง

การใช้

drop table if exists [table_name]

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


4
DROP TABLE IF EXISTS [table_name]

มันตรวจสอบก่อนว่าตารางที่มีอยู่ถ้ามันจะลบตารางในขณะที่

DROP TABLE [table_name]

มันจะลบโดยไม่ตรวจสอบดังนั้นหากไม่มีอยู่ก็จะเกิดข้อผิดพลาด


3

หากไม่มีตารางที่มีชื่อดังกล่าวDROPล้มเหลวโดยมีข้อผิดพลาดในขณะที่DROP IF EXISTSไม่ทำอะไรเลย

สิ่งนี้มีประโยชน์หากคุณสร้าง / แก้ไขฐานข้อมูลด้วยสคริปต์ วิธีนี้คุณไม่จำเป็นต้องตรวจสอบด้วยตนเองว่าตารางรุ่นก่อนหน้าถูกลบไปแล้ว คุณเพียงแค่ทำDROP IF EXISTSและลืมมัน

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


มันอาจคุ้มค่าที่จะกล่าวถึงว่า RDBMS บางตัว (โดยเฉพาะ PostgreSQL) จะส่งสัญญาณเตือนหากคุณลองdrop some_table if exists;และsome_tableไม่มีตารางอยู่

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