【发布时间】: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