Làm cách nào để loại bỏ tất cả các bảng từ cơ sở dữ liệu bằng một truy vấn SQL?


175

Tôi không muốn nhập tên của tất cả các bảng để loại bỏ tất cả chúng. Có thể với một truy vấn?


3
Một số googling nhanh chóng tiết lộ điều này: stackoverflow.com/questions/11053116/iêu
JSK NS

-tuy nhiên (đối với SQLServer) điều này có thể hữu ích hơn: stackoverflow.com/questions/536350/iêu

Với tên người dùng phù hợp, điều này có thể xảy ra tự động ( liên kết xkcd bắt buộc ).
Minnow

11
Bạn có bất kỳ khóa ngoại trên bảng trong cơ sở dữ liệu? Nếu vậy, bạn cần cân nhắc điều đó và bỏ chúng trước khi thử bỏ bảng.
Anthony Grist

Hãy nhớ rằng nếu bạn có các đối tượng schemabound, bạn không thể bỏ bảng.
Sean Lange

Câu trả lời:


176

Sử dụng khung nhìn Information_SCHema.TABLES để lấy danh sách các bảng. Tạo tập lệnh Drop trong câu lệnh select và thả nó bằng Dynamic SQL:

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

Phiên bản Sys.Tables

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + '; '
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U'

Exec sp_executesql @sql

Lưu ý: Nếu bạn có bất kỳ foreign Keysđịnh nghĩa nào giữa các bảng thì trước tiên hãy chạy truy vấn bên dưới để vô hiệu hóa tất cả foreign keyshiện diện trong cơ sở dữ liệu của bạn.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Để biết thêm thông tin, kiểm tra ở đây .


3
(không phải downvote của tôi) ... tôi thường gắn bó với các [sys]khung nhìn lược đồ nếu không yêu cầu tính di động trên rdbms '. stackoverflow.com/a/3654313/251174
swasheck


1
@DoubleA - Nó rất đơn giản. Đầu tiên là xây dựng các câu lệnh Drop cho tất cả các bảng trong cơ sở dữ liệu của tôi và lưu trữ nó vào một biến. Để kiểm tra điều này bạn có thể sử dụng Print @sqltrước exec. Sau đó, đang thực hiện các câu lệnh thả được xây dựng động thông quasp_executesql
P

2
Nếu bạn đang sử dụng Azure, sp_msforeachtable không khả dụng. Tôi tìm thấy nugget ngọt ngào này từ @Aaron Bertrand để xóa tất cả các ràng buộc FK. Hoạt động thực sự tốt với câu trả lời này. dba.stackexchange.com/questions/90033/ Mạnh
trevorc

3
Nếu sp_msforeachtable không khả dụng, bạn cũng có thể chạy truy vấn xóa nhiều lần, vì các bảng phụ thuộc vào các bảng khác sẽ bị xóa :)
Maarten Kieft

87

Nếu bạn muốn chỉ sử dụng một truy vấn SQL để xóa tất cả các bảng, bạn có thể sử dụng:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

Đây là một Thủ tục lưu trữ ẩn trong máy chủ sql và sẽ được thực thi cho mỗi bảng trong cơ sở dữ liệu bạn được kết nối.

Lưu ý: Bạn có thể cần thực hiện truy vấn một vài lần để xóa tất cả các bảng do phụ thuộc.

Lưu ý2: Để tránh ghi chú đầu tiên, trước khi chạy truy vấn, trước tiên hãy kiểm tra xem có quan hệ khóa ngoại với bất kỳ bảng nào không. Nếu có thì chỉ cần vô hiệu hóa ràng buộc khóa ngoại bằng cách chạy bên dưới truy vấn:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

1
Tôi đã thử nó trên cơ sở dữ liệu Azure SQL của mình và nó không hoạt động. Tuy nhiên, câu trả lời trên (của Prdp) đã làm việc.
Ngày

4
Đối với ghi chú bên, tôi cần chạy lệnh đầu tiên nhiều lần trước khi bỏ tất cả các bảng nhưng nó hoạt động tốt.
Alper

1
@Thatshowweroll có lẽ là do sự phụ thuộc của các bảng. Nếu một bảng có các bảng khác phụ thuộc vào nó, nó không thể bị xóa.
RageAgainstTheMachine

1
@RageAgainstTheMachine vâng, nó chắc chắn là từ các bảng có nhiều phụ thuộc chéo. Tôi muốn thông báo cho người dùng để chạy nó nhiều lần, lỗi không phải là vấn đề. Chạy lệnh đầu tiên 3-4 lần sau đó lệnh thứ hai 1 lần và BOM. Nó hoạt động như quyến rũ!
Alper

1
@KyleVassella có, điều này sẽ chỉ thực hiện trên cơ sở dữ liệu mà bạn đã mở giao diện điều khiển của mình
RageAgainstTheMachine

38

Nếu bạn không muốn nhập, bạn có thể tạo các câu lệnh bằng cách này:

USE Databasename

SELECT  'DROP TABLE [' + name + '];'
FROM    sys.tables

Sau đó sao chép và dán vào cửa sổ SSMS mới để chạy nó.


tên bảng nên được bọc trong [], nhưng hoạt động rất tốt ngay cả trên Azure
Ondra

1
Chúng tôi có thể sử dụng QUOTENAMEcũng trông gọn gàng. 'DROP TABLE ' + QUOTENAME(name) + ';'
P

13

Bạn cũng có thể sử dụng tập lệnh sau để bỏ mọi thứ, bao gồm:

  • thủ tục lưu trữ phi hệ thống
  • lượt xem
  • chức năng
  • hạn chế khóa ngoại
  • ràng buộc khóa chính
  • những cái bàn

https://michaelreichenbach.de/how-to-drop-everything-in-a-mssql-database/

/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all views */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped View: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all functions */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

9

Tôi chỉ cần thực hiện một thay đổi nhỏ đối với câu trả lời của @ NoDisplayName và sử dụng QUOTENAME()trên TABLE_NAMEcột và cũng bao gồm TABLE_SCHEMAcột bao quanh các bảng không có trong dbolược đồ.

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([TABLE_SCHEMA]) + '.' + QUOTENAME([TABLE_NAME]) + ';'
FROM [INFORMATION_SCHEMA].[TABLES]
WHERE [TABLE_TYPE] = 'BASE TABLE';

EXEC SP_EXECUTESQL @sql;

Hoặc sử dụng syschế độ xem lược đồ (theo nhận xét của @ swasheck):

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([S].[name]) + '.' + QUOTENAME([T].[name]) + ';'
FROM [sys].[tables] AS [T]
INNER JOIN [sys].[schemas] AS [S] ON ([T].[schema_id] = [S].[schema_id])
WHERE [T].[type] = 'U' AND [T].[is_ms_shipped] = 0;

EXEC SP_EXECUTESQL @sql;

4
Tôi thường gắn bó với các [sys]khung nhìn lược đồ nếu không yêu cầu tính di động trên rdbms '. stackoverflow.com/a/3654313/251174
swasheck

1
@swasheck Cảm ơn vì đường link khá thú vị. Tôi đã cập nhật câu trả lời bằng một giải pháp sử dụng các khung nhìn lược đồ sys.
AeroX

Bạn có thể sử dụng hàm Schema_name () để lấy tên lược đồ thay vì tham gia msdn.microsoft.com/en-us/l
Library / ms175068.aspx

@NoDisplayName Chỉ vì bạn có thể , không có nghĩa là bạn nên ... blog.sqlsentry.com/aaronbertrand/ Kẻ
Aaron Bertrand

@AaronBertrand - Tôi nghĩ rằng nó có thể là một cách tốt hơn. Cảm ơn đã chỉ ra điều đó.
P

9

Để theo dõi câu trả lời của Dave.Gugg, đây sẽ là mã mà ai đó sẽ cần để có được tất cả các dòng DROP TABLE trong MySQL:

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'

2
Tôi biết người đăng ban đầu dán nhãn câu hỏi với "máy chủ sql", nhưng điều này có thể hữu ích cho ai đó muốn làm điều này trong MySQL. Trong thực tế, tôi đã tìm thấy câu hỏi này khi tìm kiếm một giải pháp MySQL cho câu hỏi này, vì vậy bây giờ tôi đang chia sẻ giải pháp mà tôi đã đưa ra sau khi đọc một trong những câu trả lời ở đây.
OMA

7

Cách đơn giản nhất là bỏ toàn bộ cơ sở dữ liệu và tạo lại nó một lần nữa:

drop database db_name
create database db_name

Đó là tất cả.


1
:) ít nhất với tôi mục đích của việc thả tất cả các bảng là vì cơ sở dữ liệu không thể bị xóa
Hasan Zafari

5
không chạy lệnh này trên cơ sở dữ liệu của công ty. Hoặc sẵn sàng tìm một công việc khác.
Faraz

@FarazDurrani người đàn ông dễ dãi, bỏ tất cả các bảng dường như không phải là một thỏa thuận cho SẢN PHẨM db.
Giám sát

5

Nếu bất kỳ ai khác gặp vấn đề với giải pháp trả lời tốt nhất (bao gồm vô hiệu hóa khóa ngoại), thì đây là một giải pháp khác của tôi :

-- CLEAN DB
USE [DB_NAME]
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'DELETE FROM ?'

    DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR
    SET @Cursor = CURSOR FAST_FORWARD FOR

    SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
    LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME
    OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql
    WHILE (@@FETCH_STATUS = 0)
      BEGIN
        Exec SP_EXECUTESQL @Sql
        FETCH NEXT 
        FROM @Cursor INTO @Sql
      END
    CLOSE @Cursor DEALLOCATE @Cursor
    GO

    EXEC sp_MSForEachTable 'DROP TABLE ?'
    GO

    EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL'

3

Không hoàn toàn 1 truy vấn, vẫn khá ngắn gọn và ngọt ngào:

-- Disable all referential integrity constraints
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Drop all PKs and FKs
declare @sql nvarchar(max)
SELECT @sql = STUFF((SELECT '; ' + 'ALTER TABLE ' + Table_Name  +'  drop constraint ' + Constraint_Name  from Information_Schema.CONSTRAINT_TABLE_USAGE ORDER BY Constraint_Name FOR XML PATH('')),1,1,'')
EXECUTE (@sql)
GO

-- Drop all tables
EXEC sp_msforeachtable 'DROP TABLE ?'
GO

3

Sử dụng tập lệnh sau cho droptất cả constraints:

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) +    ' NOCHECK CONSTRAINT all; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

Sau đó chạy như sau để thả tất cả các bảng:

select @sql='';

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

Điều này làm việc cho tôi trong Cơ sở dữ liệu Azure SQL 'sp_msforeachtable'không có sẵn!


1

Tôi biết câu hỏi này rất cũ nhưng mỗi khi tôi cần mã này .. nhân tiện nếu bạn có bảng và lượt xem và Hàm và THỦ TỤC bạn có thể xóa tất cả bằng Tập lệnh này .. vậy tại sao tôi đăng Tập lệnh này ?? bởi vì nếu bạn xóa tất cả các bảng, bạn sẽ cần xóa tất cả các khung nhìn và nếu bạn có Hàm và THỦ TỤC, bạn cũng cần xóa nó.
Tôi hy vọng nó sẽ giúp được ai đó

DECLARE @sql NVARCHAR(max)=''

 SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) 
+ '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql


 DECLARE @sql VARCHAR(MAX) = ''
    , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

 SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
 QUOTENAME(v.name) +';' + @crlf
 FROM   sys.views v

 PRINT @sql;
 EXEC(@sql);

 declare @procName varchar(500)
 declare cur cursor 

 for select [name] from sys.objects where type = 'p'
 open cur
 fetch next from cur into @procName
 while @@fetch_status = 0
 begin
  exec('drop procedure [' + @procName + ']')
fetch next from cur into @procName
 end
  close cur
  deallocate cur

  Declare @sql NVARCHAR(MAX) = N'';

    SELECT @sql = @sql + N' DROP FUNCTION ' 
               + QUOTENAME(SCHEMA_NAME(schema_id)) 
               + N'.' + QUOTENAME(name)
    FROM sys.objects
  WHERE type_desc LIKE '%FUNCTION%';

   Exec sp_executesql @sql
  GO
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.