How to drop all Foreign Key constraints in all tables?

后端 未结 7 1231
难免孤独
难免孤独 2020-12-08 10:03

I want to write sql command to drop all constraints in all tables. I searched on the internet and found the following which works fine if the database is small and not compl

7条回答
  •  执念已碎
    2020-12-08 10:40

    I have improved the first script provided by @Yaroslav and the script provided by @Quandary so they now works for databases whose SQL query to drop all foreign keys one by one exceeds the size allocated for the SQL variable (4000 or MAX characters).

    The altered scripts drop 5 foreign keys per iteration (just to be safe, implemented by adding TOP 5). The scripts stop when there is no foreign key left to drop (the SQL variable stays empty after running the SELECT).

    First script by @Yaroslav

    DECLARE @SQL varchar(4000)
    IterationStart:
    SET @SQL=''
    SELECT TOP 5 @SQL = @SQL + 'ALTER TABLE ' + FK.TABLE_NAME + ' DROP CONSTRAINT [' + RTRIM(C.CONSTRAINT_NAME) +'];' + CHAR(13)
      FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
     INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
        ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
     INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
        ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
     INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
        ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
     INNER JOIN (
                SELECT i1.TABLE_NAME, i2.COLUMN_NAME
                  FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
                 INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
                    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
                WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
               ) PT
        ON PT.TABLE_NAME = PK.TABLE_NAME
    IF @SQL <> ''
    BEGIN
      EXEC(@SQL)
      GOTO IterationStart
    END
    

    Script by @Quandary

    DECLARE @sql nvarchar(MAX) 
    
    IterationStart:
    SET @sql = '' 
    
    SELECT TOP 5 @sql = @sql + 'ALTER TABLE ' + QUOTENAME(RC.CONSTRAINT_SCHEMA) 
        + '.' + QUOTENAME(KCU1.TABLE_NAME) 
        + ' DROP CONSTRAINT ' + QUOTENAME(rc.CONSTRAINT_NAME) + '; ' 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 
    
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU1 
        ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG  
        AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
        AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME 
    
    IF @SQL <> ''
    BEGIN
      EXEC(@SQL)
      GOTO IterationStart
    END
    

提交回复
热议问题