“检查约束表达式”窗口中每个UserID约束的唯一名称

时间:2019-08-08 23:52:56

标签: sql-server unique-constraint

我正在尝试为每个用户ID设置唯一的名称

Table: Settings
Cols: ID, Name, Value, UserID
Row1: 1, 'Database', 'shop',  1
Row2: 2, 'DBLogin' , 'admin', 1
Row3: 3, 'DBPass'  , 'hash',  1
Row4: 4, 'Database', 'lol',   2 --this is ok
Row5: 5, 'Database', 'shop',  3 --this is ok
Row6: 6, 'Database', 'lol',   3 --this shoud be rejected

在MS SQL Server MS的“检查约束表达式”窗口中,我尝试过创建表的示例

Name NOT IN (SELECT Name WHERE UserID = 3)

但是,即使这样也会导致错误“在此上下文中不允许子查询。仅允许标量表达式。')'附近的语法不正确”
有没有办法实现我的目标?
顺便说一句。 MS是否等同于Oracle的:NEW.field?这将很有用:

Name NOT IN (SELECT Name WHERE UserID = :NEW.UserID)

...但是它仍然是子查询
主要目标是为每个用户(C#)创建设置的字典

3 个答案:

答案 0 :(得分:1)

iSR5的答案看起来很完美。根据Damian的要求,唯一的事情应该是:

ALTER TABLE Settings 
ADD CONSTRAINT UQSettings UNIQUE(Name, UserID )

我猜除非有必要,否则无需在这些列上创建索引,因此唯一约束应该可以完成工作。

我没有足够的代表要评论,因此请在此处发布。

答案 1 :(得分:0)

只需在其上创建唯一约束即可。

CREATE UNIQUE INDEX uk_settings_userid_name ON Settings (UserID, Name);

答案 2 :(得分:0)

您可以通过使用CONSTRAINTUnique Index之一来做到这一点。

约束:

ALTER TABLE Settings 
ADD CONSTRAINT UQSettings UNIQUE(Name, [Value])

唯一索引:

CREATE UNIQUE INDEX UQSettings ON Settings(Name, [Value])