【问题标题】:Unique Name for each UserID constraint in "Check Constraint Expression" window“检查约束表达式”窗口中每个用户 ID 约束的唯一名称
【发布时间】:2019-08-08 23:52:56
【问题描述】:

我正在尝试让每个用户 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#)

【问题讨论】:

    标签: sql-server unique-constraint


    【解决方案1】:

    只需在其上创建一个唯一的约束。

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

    【讨论】:

    • 但这将限制 'theName' 只能在表中插入一次。 'theName' 应该可以为不同的 UserID 重复
    • 然后使约束覆盖两列,例如上(用户 ID,名称)。见reference
    • @DamianK。抱歉没有得到那部分。已更新。
    【解决方案2】:

    您可以使用CONSTRAINTUnique Index 来做到这一点,其中一个就足够了。

    约束:

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

    唯一索引:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2014-09-12
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多