sql-server - 忽略索引上的重复值可防止 FOREIGN KEY 约束

标签 sql-server tsql foreign-keys ignore-duplicates

由于某些架构原因,我不得不忽略索引上的重复值。它工作得很好——除非我插入了错误的数据。我正在尝试将值插入应该抛出的 FK 列:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK__constrainName".
The conflict occurred in database, table "someTable", column 'FKColumn'.

忽略重复值背后是否存在阻止插入语句抛出此异常的逻辑?

最佳答案

我猜你说的是这种情况吧?

CREATE TABLE T2(T2_ID INT PRIMARY KEY)

INSERT INTO T2 VALUES (1),(2)

CREATE TABLE T1 (T1_ID INT, T2_ID INT REFERENCES T2)
CREATE UNIQUE CLUSTERED INDEX IX ON T1(T1_ID) WITH IGNORE_DUP_KEY

INSERT INTO T1 VALUES (1,2),(1,2),(2,3),(2,3)

/*FK Violation - No rows inserted*/
SELECT * 
FROM T1

/*Duplicate key violation and potential FK Violation - one row inserted*/
INSERT INTO T1 VALUES (1,2),(1,2),(1,3),(1,3)

SELECT * 
FROM T1

DROP TABLE T1
DROP TABLE T2

如果因为重复键违规而未插入行,则在插入后不会违反 FK 约束,因此不会出错。

关于sql-server - 忽略索引上的重复值可防止 FOREIGN KEY 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7887422/

相关文章:

sql - 将 SQL 表导出为固定长度格式

sql - 在 SQL Server 2005 中显示 UNION 语句的每一列

sql-server - nvarchar(MAX) 最多可容纳多少个字符?

ruby-on-rails - 带有 ActiveRecord 的两个外键? [ rails ]

c# - 使用 LINQ 创建 JSON

sql-server - 单词的 Damerau-Levenshtein 距离

php - 选择跳过某些行的语句

sql-server - sql中具有结束时间的当前日期

具有多个引用的mysql外键

java - PostgreSQL JDBC - 可以删除但不能重新创建索引