2012-03-05 32 views
102

Ai đó có thể cho tôi biết nếu có bất kỳ sự khác biệt giữaDROP IF EXISTS VS DROP?

DROP IF EXISTS [TABLE_NAME] 
DROP [TABLE_NAME] 

Tôi yêu cầu này bởi vì tôi đang sử dụng JDBC mẫu trong ứng dụng web MVC của tôi. 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. Có thể một số giúp đỡ?

+1

Nếu bạn đang tìm ngữ pháp SQL Server, nó ở đây: http://stackoverflow.com/questions/78870 11/làm thế nào để thả-một-bàn-nếu-nó-tồn tại-trong-sql-server –

Trả lời

197

chuẩn SQL cú pháp là

DROP TABLE table_name; 

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

DROP TABLE IF EXISTS table_name; 

Thứ nhất sẽ ném 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 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 tham chiếu khác. (Xem, ví dụ.) Thứ hai sẽ không ném một lỗi nếu bảng không tồn tại, nhưng nó vẫn sẽ ném một lỗi nếu các đối tượng cơ sở dữ liệu khác phụ thuộc vào nó.

Để thả 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 mục này.

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

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

+4

Chỉ cần nghĩ rằng tôi muốn đề cập rằng nó sẽ là một ** ** ** ** ý tưởng tốt ** cho một người dùng 'CASCADE' bên trong 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 _before_ có khả năng che giấu một loạt dữ liệu mà bạn có thể không muốn. – jbowman

+1

DROP IF EXISTS (không có CASCADE) cũng được thêm vào trong SQL Server 2016. Xem http://blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/drop-if-exists-new-thing-in -sql-server-2016.aspx –

14

Bạn quên table trong cú pháp của bạn:

drop table [table_name] 

mà giọt một bảng.

Sử dụng

drop table if exists [table_name] 

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

3

Nếu không có bảng nào có tên như vậy, DROP không thành công với lỗi trong khi DROP IF EXISTS khô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 tập lệnh; bằng cách này bạn không phải tự bảo đảm rằng các phiên bản trước của bảng sẽ bị xóa. Bạn chỉ cần làm một DROP IF EXISTS và quên nó đi.

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.

+0

Nó cũng có thể đáng nói đến một số RDBMSs (PostgreSQL nói riêng) ném một cảnh báo nếu bạn cố gắng 'thả some_table nếu tồn tại; 'và bảng' some_table' không tồn tại. –

+0

Ah, và tất nhiên juegen d và Flakron là đúng. 'DROP' cần bạn xác định loại đối tượng (' TABLE' trong trường hợp này) – SJuan76

4
DROP TABLE IF EXISTS [table_name] 

nó kiểm tra đầu tiên nếu bàn tồn tại, nếu có thì nó sẽ xoá bàn 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 nó thoát với một lỗi

23

Nó không phải là những gì được hỏi trực tiếp.Nhưng tìm cách làm bảng thả đúng cách, tôi vấp phải câu hỏi này, như tôi đoán nhiều người khác cũng 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 cho một bảng vĩnh viễn

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

Hoặc này, đối với một bảng tạm thời

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL 
    DROP TABLE #T; 
Các vấn đề liên quan