用于检查其他列的SQL Server约束
产品:SQL Server 是否可以编写一个约束来检查其他列的值?在我的具体案例中,我将给您举一个例子: 假设我有一个5列的表:用于检查其他列的SQL Server约束,sql,sql-server,tsql,Sql,Sql Server,Tsql,产品:SQL Server 是否可以编写一个约束来检查其他列的值?在我的具体案例中,我将给您举一个例子: 假设我有一个5列的表: Name | Hobby1 | Hobby2 | Hobby3 | Hobby4 假设其中包含以下值: John Doe| fishing | reading| swimming| jogging 我试图达到以下目标: 如果有人试图插入:约翰·多伊、钓鱼、阅读 它应该被阻止,因为我不想在前3列中使用相同的组合 我能意识到这是一个约束吗?还是我需要前3列的主键组合
Name | Hobby1 | Hobby2 | Hobby3 | Hobby4
假设其中包含以下值:
John Doe| fishing | reading| swimming| jogging
我试图达到以下目标:
如果有人试图插入:约翰·多伊、钓鱼、阅读
它应该被阻止,因为我不想在前3列中使用相同的组合
我能意识到这是一个约束吗?还是我需要前3列的主键组合
感谢您的回复。为表的前三列添加唯一约束
ALTER TABLE YourTableName
ADD CONSTRAINT UK_Name_Hobby1_Hobby2 UNIQUE (Name, Hobby1,Hobby2);
好吧,你可以按照@jarlh(在评论中)所说的去做,并确保爱好专栏是有序的,这将满足你的要求:
CREATE TABLE Hobbies
(
Name VARCHAR(35) NOT NULL,
Hobby1 VARCHAR(35) NOT NULL,
Hobby2 VARCHAR(35) NOT NULL,
Hobby3 VARCHAR(35),
Hobby4 VARCHAR(35),
CHECK ( Hobby1 < Hobby2 ),
CHECK ( Hobby2 < Hobby3 ),
CHECK ( Hobby3 < Hobby4 ),
UNIQUE ( Name, Hobby1, Hobby2 ),
);
糟糕的桌子设计。有一个嗜好列,而不是几行。创建一个唯一的约束,其中三个列是唯一的,虽然你可以想出更好的设计。这只是为了简化问题,我的数据库中没有这样的表结构。谢谢你的回复!是的,包含前3列的主键可能正是您需要的约束。或者,如果其中一些是可空的,那么它应该是唯一的约束,加上仅在
name NOT NULL
上的PRIMARY。。。hobby5,即字母顺序。嗨,谢谢你的回复。如果我的第三列中有空值怎么办?我能否克服这一点:无名氏,钓鱼,空;John Doe,钓鱼,将接受NULL?唯一约束允许NULL一次
INSERT INTO Hobbies VALUES ( 'John Doe', 'fishing', 'jogging', 'reading', 'swimming' );
INSERT INTO Hobbies VALUES ( 'John Doe', 'jogging', 'reading', 'swimming', NULL );