我想创建具有复合键的表,其组合必须是唯一的。
例如,
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
)
答案 0 :(得分:2)
你可以使用用户定义的类型来做到这一点,但恕我直言,这听起来像一个糟糕的设计,可能是一个XY问题。
如果您正在尝试创建多对多表格(例如,共享朋友的表格),我建议您使用检查约束来始终确保field1
严格小于field2
您甚至可以更进一步,并且需要使用存储过程来插入行,或者创建INSTEAD OF INSERT
触发器。这将为您排列正确的行,这样您就不必依赖前端知道列应该在哪个顺序。
答案 1 :(得分: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!"