2013-02-27 61 views
12

tôi có như sau:Làm thế nào tôi có thể thả bảng nếu có ràng buộc khóa ngoài trong SQL Server?

DROP TABLE [dbo].[ExtraUserInformation]; 
DROP TABLE [dbo].[UserProfile]; 
DROP TABLE [dbo].[webpages_Membership]; 
DROP TABLE [dbo].[webpages_OAuthMembership]; 
DROP TABLE [dbo].[webpages_Roles]; 
DROP TABLE [dbo].[webpages_UsersInRoles]; 

CREATE TABLE [dbo].[ExtraUserInformation] (
    [Id]  INT   IDENTITY (1, 1) NOT NULL, 
    [UserId] INT   NOT NULL, 
    [FullName] NVARCHAR (MAX) NULL, 
    [Link]  NVARCHAR (MAX) NULL, 
    [Verified] BIT   NULL, 
    CONSTRAINT [PK_dbo.ExtraUserInformation] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

CREATE TABLE [dbo].[webpages_UsersInRoles] (
    [UserId] INT NOT NULL, 
    [RoleId] INT NOT NULL, 
    PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC), 
    CONSTRAINT [fk_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[UserProfile] ([UserId]), 
    CONSTRAINT [fk_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[webpages_Roles] ([RoleId]) 
); 

Tuy nhiên điều này là không có một thông báo nói:

Msg 3726, Level 16, State 1, Line 6 
Could not drop object 'dbo.UserProfile' because it is referenced by a FOREIGN KEY constraint. 
Msg 3726, Level 16, State 1, Line 9 
Could not drop object 'dbo.webpages_Roles' because it is referenced by a FOREIGN KEY constraint. 
Msg 2714, Level 16, State 6, Line 27 
There is already an object named 'UserProfile' in the database. 
Checking identity information: current identity value 'NULL', current column value 'NULL'. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

Làm thế nào tôi có thể thả một bảng trong những trường hợp này?

+0

thả tài liệu tham khảo đầu tiên – Sergio

+0

Kiểm tra câu hỏi này: http://stackoverflow.com/questions/1776079/sql-drop-table-foreign-key-constraint Đây là nhiệm vụ SQL Server phổ biến – MPH

+0

bạn phải DROP CONSTRAINS –

Trả lời

14

Bạn phải bỏ ràng buộc trước khi bạn có thể thả bảng.Thông minh khác là vi phạm quy tắc của nó. Làm thế nào để có được các mối quan hệ chính nước ngoài xem câu hỏi cũ này. SQL DROP TABLE foreign key constraint

4

1-trước hết, thả ràng buộc khóa ngoài sau khi thả bảng.

2 bạn có thể thả tất cả các chìa khóa nước ngoài thông qua thực hiện các truy vấn sau đây:

DECLARE @SQL varchar(4000)='' 
SELECT @SQL = 
@SQL + 'ALTER TABLE ' + s.name+'.'+t.name + ' DROP CONSTRAINT [' + RTRIM(f.name) +'];' + CHAR(13) 
FROM sys.Tables t 
INNER JOIN sys.foreign_keys f ON f.parent_object_id = t.object_id 
INNER JOIN sys.schemas  s ON s.schema_id = f.schema_id 

--EXEC (@SQL) 

PRINT @SQL 

nếu bạn thực hiện các kết quả in @SQL, các phím nước ngoài sẽ bị loại bỏ.

3

câu trả lời tốt nhất để thả các bảng chứa hạn chế nước ngoài là:

  • Bước 1: Thả phím Primary của bảng.
  • Bước 2: Bây giờ nó sẽ nhắc có xóa tất cả các tham chiếu nước ngoài hay không.
  • Bước 3: Xóa bảng.
-1

Để thả bảng nếu có ràng buộc khóa ngoài trong Máy chủ MySQL?

Chạy truy vấn sql:

SET FOREIGN_KEY_CHECKS = 0; DROP TABLE table_name

Hy vọng điều đó sẽ hữu ích!

+1

Câu hỏi đặt ra là về Microsoft SQL Server không phải là MySQL –

+0

đã giải quyết được vấn đề của tôi. –

1

BhupeshC and murat, đây là những gì tôi đang tìm kiếm. Tuy nhiên @SQL varchar (4000) không đủ lớn. Vì vậy, thay đổi nhỏ

DECLARE @cmd varchar(4000) 

DECLARE MY_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 

select 'ALTER TABLE ['+s.name+'].['+t.name+'] DROP CONSTRAINT [' + RTRIM(f.name) +'];' FROM sys.Tables t INNER JOIN sys.foreign_keys f ON f.parent_object_id = t.object_id INNER JOIN sys.schemas s ON s.schema_id = f.schema_id 

OPEN MY_CURSOR 
FETCH NEXT FROM MY_CURSOR INTO @cmd 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    -- EXEC (@cmd) 
    PRINT @cmd 
    FETCH NEXT FROM MY_CURSOR INTO @cmd 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 

GO 
2

Bạn phải bỏ ràng buộc trước khi thả bảng.

Bạn có thể sử dụng các truy vấn đó để tìm tất cả FK trong bảng và tìm FK trong bảng mà bảng của bạn được sử dụng.

Declare @SchemaName VarChar(200) = 'Your Schema name' 
Declare @TableName VarChar(200) = 'Your Table Name' 

-- Find FK in This table. 
SELECT 
    ' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = 
OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
+ ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + 
OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    'ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.parent_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 


-- Find the FKs in the tables in which this table is used 
    SELECT 
    ' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = 
     OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
    + ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + 
OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    ' ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.referenced_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 
+0

Thủ tục Excel !! – raBinn

Các vấn đề liên quan