【发布时间】:2019-09-13 18:07:39
【问题描述】:
我正在尝试使用来自生产服务器的数据刷新开发服务器,但这不能通过直接恢复来完成,因为开发环境包含我们需要保留的不在生产环境中的对象。所以我想做的是截断需要刷新的表,然后插入数据。我为此创建了一个程序,它一直有效,直到我们得到外键。
我继承的数据库写得不是很好,在大多数表中都有几个主键列。我正在查看这个问题Cannot truncate table because it is being referenced by a FOREIGN KEY constraint? 并将@peter-szanto 和@marc-2377 提供的最佳解决方案合并到存储过程中,只要在插入#FKs 中的sys.foreign_key_columns 中有一个唯一约束,它就可以很好地工作.使用脚本会出错
“引用的表中没有主键或候选键”
在某些表上,因为它们引用具有多个主键列作为一个外键的表。
代码原样返回这些以重新创建表FK_stmnt中的fks
ALTER TABLE [dbo].[sometable] WITH NOCHECK
ADD CONSTRAINT [sometable$othertable__12345]
FOREIGN KEY([fk1]) REFERENCES [dbo].[othertable] ([pk1])
ALTER TABLE [dbo].[sometable] WITH NOCHECK
ADD CONSTRAINT [sometable$othertable__12345]
FOREIGN KEY([fk2]) REFERENCES [dbo].[othertable] ([pk2])
ALTER TABLE [dbo].[sometable] WITH NOCHECK
ADD CONSTRAINT [sometable$othertable__12345]
FOREIGN KEY([fk3]) REFERENCES [dbo].[othertable] ([pk3])
ALTER TABLE [dbo].[sometable] WITH NOCHECK
ADD CONSTRAINT [sometable$othertable__12345]
FOREIGN KEY([fk4]) REFERENCES [dbo].[othertable] ([pk4])
ALTER TABLE [dbo].[sometable] WITH NOCHECK
ADD CONSTRAINT [sometable$othertable__12345]
FOREIGN KEY([fk5]) REFERENCES [dbo].[othertable] ([pk5])
需要返回结果为
ALTER TABLE [dbo].[sometable] WITH NOCHECK
ADD CONSTRAINT [sometable$othertable__12345]
FOREIGN KEY ([fk1], [fk2], [fk3], [fk4], [fk5])
REFERENCES [dbo].[othertable] ([pk1], [pk2], [pk3], [pk4], [pk5])
即对于每个 sometable$othertable__12345 约束将列组合在一个语句中。
有什么想法吗?
【问题讨论】:
-
复合键(包括主键)只要满足业务需求就可以。
-
可以,只要它们满足业务需求。但这实际上是一个到处都有重复数据的数据库的巨大噩梦,因此几乎每个表上的复合键都带有 fk
标签: sql tsql foreign-keys truncate composite-key