我正在尝试为每个用户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#)创建设置的字典
答案 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)
您可以通过使用CONSTRAINT
或Unique Index
之一来做到这一点。
约束:
ALTER TABLE Settings
ADD CONSTRAINT UQSettings UNIQUE(Name, [Value])
唯一索引:
CREATE UNIQUE INDEX UQSettings ON Settings(Name, [Value])