如何在SQLAzure中清除带有外键约束的表中的数据

如何在SQLAzure中清除带有外键约束的表中的数据,sql,sql-server,azure,azure-sql-database,Sql,Sql Server,Azure,Azure Sql Database,我需要删除某些表中的所有数据deleteofthetabletwo,deleteofthetableone等都很有效(它不会重新设定种子,但我可以学会接受它) 我想通过截断表来实现这一点(因为这样更快,而且我确信当我清空这些表时,数据完整性会很好),但是TableOne是TableTwo的依赖项,因此简单的方法会给我错误“无法截断…外键约束” 我在constraints文件夹中查找并尝试了以下操作: ALTER TABLE [TableOne] DROP CONSTRAINT [DF__Blah

我需要删除某些表中的所有数据
deleteofthetabletwo
deleteofthetableone
等都很有效(它不会重新设定种子,但我可以学会接受它)

我想通过截断表来实现这一点(因为这样更快,而且我确信当我清空这些表时,数据完整性会很好),但是TableOne是TableTwo的依赖项,因此简单的方法会给我错误“无法截断…外键约束”

我在constraints文件夹中查找并尝试了以下操作:

ALTER TABLE [TableOne] DROP CONSTRAINT [DF__Blahblah__38EE7070]
GO
TRUNCATE TABLE [TableOne]
GO
ALTER TABLE [TableOne] ADD  DEFAULT ((0)) FOR [Something]
GO
然而,它给出了相同的错误。另外,除非我手动检查,否则38EE7070对我来说是未知的,所以无论如何,我在实际使用该代码时都会遇到问题

我不知道是否未触及其他未知约束,但令人困惑的是,当我尝试检查
EXEC sp_fkeys'TableOne'
时,它显示的是空结果


考虑到sql server和azure的局限性,其他问题中的许多解决方案似乎都不可行。有人知道我该怎么做吗?Ie如何删除并重新创建这些键?

唯一的方法是删除外键,截断表,然后重新创建外键。对于内部解决方案,您可能会采用这种方法来考虑事务日志的大小和性能。然而,在SQLAzure中,您并不关心事务日志。

Nathan

有几件事我应该指出

1) 您发布的示例代码是删除并创建默认约束(即,如果在插入过程中未指定值,则为列设置默认值的约束)。默认约束对截断表的能力没有影响(正如您正确指出的,具有外键约束的表不能被截断)

2) 我认为SPfkeys是用于SQL 2000的,因此在SQL Server的更高版本中可能不再工作(即使它仍然存在)

下面我附加了一个脚本,用于标识表上的所有外键约束,并生成Create、Drop和Check语句。虽然我从未在SQLAzure上使用过它,但我已经在SQLServer2008R2的生产环境中多次使用过它

我希望有帮助。如果你有任何问题,请告诉我

灰烬


这不是我的原创作品(我想表扬作者,但不记得是从哪里抓到的),但我发布它是因为它在SQL 2012和Azure SQL数据库中为我找到了表上的FK约束:

挑选 对象名称(f.parent\u OBJECT\u id)表名, COL\u NAME(fc.parent\u object\u id,fc.parent\u column\u id)ColName 从…起 系统外键为f 内连接 sys.foreign\u key\u列作为fc 在f.OBJECT\u ID=fc.constraint\u OBJECT\u ID上 内连接 系统表t 在t.OBJECT\u ID=fc.referenced\u OBJECT\u ID上 哪里 对象\u名称(f.引用的\u对象\u id)=“YourTableNameHere”按表名排序

CREATE FUNCTION [utils].[uf_ForeignKeyScripts]
(
@PrimaryKeyTable varchar(128), @PrimaryKeyTableSchema varchar(32)
)
RETURNS @Scripts TABLE 
    (
    ForeignKeyName          varchar(128)
,   IfExistsStatement       varchar(1000)
,   DropStatement           varchar(1000)
,   IfNotExistsStatement    varchar(1000)
,   CreateStatement         varchar(1000)
,   CheckStatement          varchar(1000)
,   NoCheckStatement        varchar(1000)
    )
    AS

/*
This function returns statements used to create, drop, and check all Foreign Key constraints that reference a given table.
These statements can be then added to T-SQL scripts.

Example usage (ensure selection of the Results to Text option in SSMS) :

1) To create statements to check all foreign keys

SELECT
    IfExistsStatement + CHAR(13) +
    CHAR(9) + CheckStatement + CHAR(13)
FROM
    utils.uf_ForeignKeyScripts('t_Dim_Date','dbo')      
    ;

This will return a formatted statement to check the existence of a foreign key and if it exists, check that data does not violate the key.

*/

BEGIN
    INSERT INTO
        @Scripts
        (
        ForeignKeyName
    ,   IfExistsStatement
    ,   DropStatement
    ,   IfNotExistsStatement
    ,   CreateStatement
    ,   CheckStatement
    ,   NoCheckStatement
        )
    SELECT
        FK.name AS ForeignKeyName
    ,   'IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + SFK.name + '.' + FK.name + ''') ' + 
        'AND parent_object_id = OBJECT_ID(N''' + SFK.name + '.' + OBJECT_NAME(FK.parent_object_id) + '''))'
        AS IfExistsStatement
    ,   'ALTER TABLE ' + SFK.name + '.' + OBJECT_NAME(FK.parent_object_id) + ' ' + 
        'DROP CONSTRAINT ' + FK.name + CHAR(13) + ';' 
        AS DropStatement
    ,   'IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + SFK.name + '.' + FK.name + ''') ' + 
        'AND parent_object_id = OBJECT_ID(N''' + SFK.name + '.' + OBJECT_NAME(FK.parent_object_id) + '''))'
        AS IfNotExistsStatement 
    ,   'ALTER TABLE ' + SFK.name + '.' + OBJECT_NAME(FK.parent_object_id) + ' ' +
        'WITH CHECK ADD CONSTRAINT ' + FK.name + ' ' + 
        'FOREIGN KEY (' + C.FKColumns + ') ' + 
        'REFERENCES ' + ST.name + '.' + OBJECT_NAME(fk.referenced_object_id) + ' ' + 
        '(' + C.FKColumns + ')' + CHAR(13) + ';' 
        AS CreateStatement
    ,   'ALTER TABLE ' + SFK.name + '.' + OBJECT_NAME(FK.parent_object_id) + ' ' +
        'CHECK CONSTRAINT ' + FK.name + CHAR(13) + ';'
        AS CheckStatement
    ,   'ALTER TABLE ' + SFK.name + '.' + OBJECT_NAME(FK.parent_object_id) + ' ' +
        'NOCHECK CONSTRAINT ' + FK.name +   CHAR(13) + ';'
        AS NoCheckStatement
    FROM
        sys.foreign_keys AS FK
    INNER JOIN
        sys.schemas AS SFK -- schema of foreign key table
    ON
        FK.schema_id = SFK.schema_id
    INNER JOIN
        sys.tables AS T -- primary key table
    ON
        FK.referenced_object_id = T.object_id
    INNER JOIN
        sys.schemas AS ST -- schema of primary key table
    ON
        T.schema_id = ST.schema_id
    CROSS APPLY
        (
        /* Get all columns to handle composite keys */
        SELECT 
            SFKC.constraint_object_id
        ,   utils.uf_ConcatanateStringWithDelimiter(COL_NAME(SFKC.referenced_object_id, SFKC.referenced_column_id),', ') AS FKColumns
        FROM
            sys.foreign_key_columns AS SFKC
        WHERE
            SFKC.constraint_object_id = FK.object_id
        GROUP BY
            SFKC.constraint_object_id
        )
        AS C
    WHERE
        OBJECT_NAME(T.object_id) = @PrimaryKeyTable
    AND ST.name = @PrimaryKeyTableSchema
    ;
    RETURN 
END