How to drop all Foreign Key constraints in all tables?

后端 未结 7 1227
难免孤独
难免孤独 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:49

    I used the INFORMATION_SCHEMA solution mentioned by @Yaroslav, but had too many foreign key constants in my database to fit them all into a varchar(MAX). So I had to modify the script to use a temporary table and a cursor instead.

    Also, I added [] around the table name.

    DECLARE @SQL TABLE (Command VARCHAR(MAX))
    
    INSERT @SQL
    SELECT '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
    
    DECLARE cmdCursor CURSOR
        FOR SELECT Command FROM @SQL
    OPEN cmdCursor
    DECLARE @Command VARCHAR(MAX)
    
    FETCH NEXT FROM cmdCursor INTO @Command
    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT @Command
        EXEC (@Command)
        FETCH NEXT FROM cmdCursor INTO @Command
    END
    
    CLOSE cmdCursor;
    DEALLOCATE cmdCursor;
    

提交回复
热议问题