DROP NẾU EXISTS VS DROP?


163

Ai đó có thể cho tôi biết nếu có bất kỳ sự khác biệt giữa

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

Tôi hỏi điều này bởi vì tôi đang sử dụng mẫu JDBC trong ứng dụng web MVC của mình. Nếu tôi sử dụng DROP [TABLE_NAME]lỗi nói rằng Bảng tồn tại. Và nếu tôi sử dụng DROP IF EXISTS [TABLE_NAME]nó nói ngữ pháp SQL xấu. Ai đó có thể giúp gì không?


1
Nếu bạn đang tìm kiếm ngữ pháp Máy chủ SQL, thì đây là: stackoverflow.com/questions/7887011/iêu
Drew Delano

Tôi nghĩ rằng điều này nên có một thẻ về câu hỏi cho cơ sở dữ liệu cụ thể.
Tom Stickel

Câu trả lời:


293

Cú pháp SQL chuẩn là

DROP TABLE table_name;

IF EXISTSkhông chuẩn; các nền tảng khác nhau có thể hỗ trợ nó với cú pháp khác nhau hoặc hoàn toàn không hỗ trợ nó. Trong PostgreSQL, cú pháp là

DROP TABLE IF EXISTS table_name;

Cái đầu tiên sẽ đưa ra một lỗi nếu bảng không tồn tại hoặc nếu các đối tượng cơ sở dữ liệu khác phụ thuộc vào nó. Thông thường, các đối tượng cơ sở dữ liệu khác sẽ là các tham chiếu khóa ngoài, nhưng cũng có thể có các đối tượng khác. (Ví dụ: Lượt xem.) Thứ hai sẽ không đưa ra lỗi nếu bảng không tồn tại, nhưng nó vẫn sẽ báo lỗi nếu các đối tượng cơ sở dữ liệu khác phụ thuộc vào nó.

Để thả một bảng và tất cả các đối tượng khác phụ thuộc vào nó, hãy sử dụng một trong các đối tượng này.

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

Sử dụng CASCADE rất cẩn thận.


6
Chỉ cần nghĩ rằng tôi sẽ đề cập rằng nó sẽ là một ý tưởng thực sự tốt cho một người sử dụng CASCADEtrong một khối giao dịch ( BEGIN... COMMIT). Bằng cách này, rõ ràng cơ sở dữ liệu sẽ bị ảnh hưởng như thế nào trước khi có khả năng ghi đè một loạt dữ liệu mà bạn có thể không muốn.
jbowman

3
DROP IF EXISTS (không có CASCADE) cũng được thêm vào SQL Server 2016. Xem blog.msdn.com/b/sqlserverst Storageengine / archive / 2015/11/03 / Bọ
Jovan MSFT

35

Nó không phải là những gì được hỏi trực tiếp. Nhưng tìm kiếm làm thế nào để thả bảng đúng cách, tôi vấp phải câu hỏi này, vì tôi đoán nhiều người khác cũng làm như vậy.

Từ SQL Server 2016+ bạn có thể sử dụng

DROP TABLE IF EXISTS dbo.Table

Đối với SQL Server <2016, những gì tôi làm là như sau đối với bảng cố định

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

Hoặc này, cho một bảng tạm thời

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

17

Bạn đã quên tabletrong cú pháp của bạn:

drop table [table_name]

mà làm rơi một cái bàn

Sử dụng

drop table if exists [table_name]

kiểm tra nếu bảng tồn tại trước khi thả nó.
Nếu nó tồn tại, nó bị rơi.
Nếu không, sẽ không có lỗi được ném và không có hành động nào được thực hiện.


4
DROP TABLE IF EXISTS [table_name]

đầu tiên nó kiểm tra nếu bảng tồn tại, nếu nó xóa bảng trong khi

DROP TABLE [table_name]

nó xóa mà không kiểm tra, vì vậy nếu nó không tồn tại thì nó thoát với một lỗi


3

Nếu không có bảng có tên như vậy tồn tại, DROPlỗi với lỗi trong khi DROP IF EXISTSkhông làm gì cả.

Điều này rất hữu ích nếu bạn tạo / sửa đổi cơ sở dữ liệu của mình bằng một tập lệnh; bằng cách này, bạn không phải đảm bảo rằng các phiên bản trước của bảng sẽ bị xóa theo cách thủ công. Bạn chỉ cần làm một DROP IF EXISTSvà quên nó.

Tất nhiên, công cụ DB hiện tại của bạn có thể không hỗ trợ tùy chọn này, thật khó để nói thêm về lỗi với thông tin bạn cung cấp.


Cũng có thể đáng nói rằng một số RDBMS (cụ thể là PostgreSQL) đưa ra cảnh báo nếu bạn thử drop some_table if exists;và bảng some_tablekhông tồn tại.

Ah, và tất nhiên juegen d và Flakron đều đúng. DROPcần bạn chỉ định loại đối tượng ( TABLEtrong trường hợp này)
SJuan76
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.