0

我想用复合键创建表,其组合必须是唯一的。

例如,

CREATE TABLE [dbo].[TEST3](
    [field1][int] NOT NULL,
    [field2][int] NOT NULL
PRIMARY KEY (field1,field2)
)
GO

行:

field1    field2
----------------
   1        2
   2        1

如何防止此类行为?2,1当用户将行()插入已经有行(1,2)的表时,我需要出错

4

2 回答 2

2

您可能可以使用用户定义的类型来做到这一点,但恕我直言,这听起来像是一个糟糕的设计,并且可能是一个 XY 问题。

如果您尝试创建一个多对多表(例如,共同朋友的表),我建议您使用检查约束来始终确保field1严格小于field2.

您甚至可以更进一步,要求使用存储过程来插入行或创建INSTEAD OF INSERT触发器。这将为您将行按正确的顺序排列,这样您就不必依赖前端知道列的顺序。

于 2013-03-01T15:46:28.530 回答
1

一些插入(和更新)触发器将是可能的解决方案,即

create trigger prevent 
on TEST3 
for insert 
as 
if (select count(1) 
    from TEST3, inserted 
    where TEST3.field1=inserted.field2 and TEST3.field2=inserted.field1) > 0  
/* Cancel the insert and print a message.*/
  begin
    rollback transaction 
    print "Failed." 
  end  
/* Otherwise, allow it. */
else
  print "Added!"
于 2013-03-01T15:53:24.670 回答