[英]How to create combined primary key in SQL Server 2008?
我有一个表,我从字段word1和word2创建了一个复合主键,它们的数据类型均为int。
现在我要避免这样的记录:
-------- Word1---------Word2--------------
1 2
2 1
我想将-1 2-和-2 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
检查约束可用于确保没有“传递”键。 一个例子:
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,则check (Word1 <= Word2)
它check (Word1 <= Word2)
这确实存在一个可能的索引问题:要查找所有引用值N的行,您必须同时检查两列...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.