如何在SQL Server 2008中创建组合主键?

时间:2014-05-13 23:12:10

标签: sql sql-server sql-server-2008

我有一个表,我从字段word1和word2创建了一个复合主键,它们的数据类型都是int。

现在我想避免这样的记录:

-------- Word1---------Word2--------------
           1             2  
           2             1

我想把 - 1 2 - 和 - 2 1 - 视为一把钥匙。

我该怎么做?

3 个答案:

答案 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的所有行,您必须同时检入两列......