处理FK约束 - 清空和重新填充sql server 2008 db

时间:2010-12-01 00:01:00

标签: sql sql-server-2008 foreign-keys constraints

我在MS SQL Server 2008 R2中有一个SQL DB

出于开发目的,我试图清除所有数据 - 然后添加我的虚拟数据。

经过与FK Constraints的一些斗争,并使用

ALTER TABLE ? NOCHECK CONSTRAINT ALL
DELETE FROM ?
ALTER TABLE ? CHECK CONSTRAINT ALL

我设法清除数据。

现在我想添加一些虚拟数据。

假设我们有3个表格,CountryAddressCountry_Address(将地址与国家/地区相关联)。

我已将数据添加到CountryAddress

但是当我尝试添加到Country_Address时:


没有更新行。

第1行中的数据未提交。 错误来源:.Net SqlClient数据提供程序。 错误消息:INSERT语句与FOREIGN KEY约束冲突


我不太清楚为什么会这样,因为我所做的只是连接新添加的国家和地址 - 两者都存在 - 那么为什么它与FK约束冲突?

通过谷歌搜索,它暗示可能需要重新种植表格来解决这个问题。首先,我不是100%确定重播意味着什么,我假设它正在讨论重置自动生成的ID列。

我在向CountryAddress添加新记录时注意到他们使用int从最后一条记录(现在已经消失)增加,例如从id为400

开始

如何添加数据?

4 个答案:

答案 0 :(得分:1)

听起来您在Country和Address表中有一个ID列,Country_Address中的值是引用其他两个表的ID值。并且,您似乎已经拥有Country_Address的数据,该数据具有引用数据的原始值。

因此,重新种植可能是解决方案。我假设你的表看起来像这样。

Country
-------
CountryID int identity(1, 1)
Country varchar(100)

Address
-------
AddressID int identity(1, 1)
Address varchar(100)
City varchar(100)

除了每个表中的CountryID和AddressID列之外,重定位的确切列并不重要。 identity(1, 1)属性表示从1开始自动编号并递增1.因此,要重新设置Country和Address表,可以在将数据添加到Country和Address表之前执行以下操作:

DBCC CHECKIDENT ('Country', RESEED, 1)
DBCC CHECKIDENT ('Address', RESEED, 1)

可能没有必要为Country_Address运行命令,除非它有一个具有标识属性的列。

答案 1 :(得分:1)

重新播种意味着重置主键的自动递增ID。您可以通过Management Studio或使用DDL语句重新设置SQL Server表。 Example

请记住,如果你正在做的是测试,你总是可以完全放弃外键约束以使它们脱离你的方式。只需确保加载到表中的数据正确填充外键。

答案 2 :(得分:1)

如果要清空所有表,我发现编写数据库结构的脚本最简单(你已经完成了这个并把它放到源控件中吗?)然后删除数据库并重新创建它。然后运行脚本以添加虚拟数据。

答案 3 :(得分:0)

尝试截断表TRUNCATE TABLE table_name,然后重新插入数据。