【问题标题】:How to drop and re-create primary keys and foreign keys如何删除和重新创建主键和外键
【发布时间】:2014-02-19 05:36:59
【问题描述】:

我有一个包含主键和外键列表的数据库。我想删除所有外键和主键并重新创建这两个键。到目前为止,我已经能够删除并重新创建主键,但无法在删除后添加外键。删除并重新创建后,我没有得到所有外键。

--查询使用drop语句获取所有外键

SELECT    'IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + QUOTENAME(SCHEMA_NAME()) + '.' + QUOTENAME(fk.name) + ''') AND parent_object_id = OBJECT_ID(N''' + QUOTENAME(SCHEMA_NAME()) + '.' + QUOTENAME(so.name) + '''))' + CHAR(13)
        + 'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME()) + '.' + QUOTENAME(so.name) + ' DROP CONSTRAINT ' + QUOTENAME(fk.name) + '' 
FROM    sys.foreign_keys fk
        inner join sys.sysobjects so ON (fk.parent_object_id = so.id)

--用Add语句查询所有外键

SELECT    'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME()) + '.' + QUOTENAME(spo.Name) + ' WITH CHECK ADD CONSTRAINT ' + QUOTENAME(fk.name) + ' FOREIGN KEY(' + QUOTENAME(fkpc.name) + ') REFERENCES ' + QUOTENAME(SCHEMA_NAME()) + '.' + QUOTENAME(sro.name) + ' (' + QUOTENAME(fkrc.name) + ')' + CHAR(13)
        + 'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME()) + '.' + QUOTENAME(spo.name) + ' CHECK CONSTRAINT ' + QUOTENAME(fk.name) + '' + CHAR(13) + CHAR(13)
FROM    sys.foreign_keys fk
        INNER JOIN sys.sysobjects spo on (fk.parent_object_id = spo.id)
        INNER JOIN sys.sysobjects sro on (fk.referenced_object_id = sro.id)
        INNER JOIN sys.foreign_key_columns fkc on (fk.object_id = fkc.constraint_object_id)
        INNER JOIN sys.all_columns fkpc on (fkc.parent_object_id = fkpc.object_id and fkc.parent_column_id = fkpc.column_id)
        INNER JOIN sys.all_columns fkrc on (fkc.referenced_object_id = fkrc.object_id and fkc.referenced_column_id = fkrc.column_id)   

【问题讨论】:

  • 你遇到了什么错误?
  • 如何生成脚本来重新创建主键?也可以使用相同的方法生成脚本来重新创建外键!
  • 我收到错误,例如没有找到主键或候选键。但我得到了所有主键
  • 外键删除成功,添加不正确
  • 只是为了确保:您正在创建两个脚本之前执行 DROP 语句,对吧? ;-) 另外,你为什么要这样做?

标签: sql-server


【解决方案1】:

要删除所有外键,您可以尝试使用此脚本:

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
 declare @constraints nvarchar(2000)
 SELECT TOP 1 @constraints=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
 FROM information_schema.table_constraints
 WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
 exec (@constraints)
 PRINT @constraints
end
GO

不要忘记在您的数据库上运行它! ))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多