我有一个表,我从字段word1和word2创建了一个复合主键,它们的数据类型都是int。
现在我想避免这样的记录:
-------- Word1---------Word2--------------
1 2
2 1
我想把 - 1 2 - 和 - 2 1 - 视为一把钥匙。
我该怎么做?
答案 0 :(得分:2)
我认为您需要创建一个CHECK约束来调用执行此检查的UDF。据我所知,没有内置的方法来使用SQL Server。像这样:
ALTER TABLE MyTable
ADD CONSTRAINT SwappableUnique CHECK(dbo.SwappableUnique(Word1, Word2))
您可以在CHECK constraints here上阅读更多内容。
答案 1 :(得分:1)
对于要插入的每个新行,如果word1和word 2是不同的值,则始终使用word1中的两个值中的较低值插入它们,并将word2中的两个值中较高的值插入。
Insert myTable(word1, word2, etc.)
values (case When @word1 < @word2 then @word1 else @word2 End,
case When @word1 < @word2 then @word2 else @word1 End,
etc.)
或使用触发器
Create trigger NoWord1Word2Dupes
On myTable for Insert, Update
As
Begin
If Exists(Select * From MyTable e
join inserted I
on i.Word1 = e.word2
and i.word2 = e.word1)
Begin
Rollback Transaction
Raiserror ('Duplicate exists with swapped word1, word2 values.', 16, 1)
End
End
答案 2 :(得分:0)
检查约束可用于确保没有“传递”键。一个例子:
CREATE TABLE MyTable
(
Word1 int not null
,Word2 int not null
,constraint PK_MyTable
primary key clustered (Word1, Word2)
,constraint CK_MyTable__KeyCheck
check (Word1 < Word2)
)
这可以防止Word2小于或等于Word1的任何行。 (如果Word1 = Word2是alloed,请将其check (Word1 <= Word2)
这确实留下了一个可能的索引问题:要查找引用值N的所有行,您必须同时检入两列......