代码之家  ›  专栏  ›  技术社区  ›  noblerare

多列上的SQL UNIQUE约束-是它们的组合必须是唯一的,还是至少有一个?

sql
  •  0
  • noblerare  · 技术社区  · 3 年前

    我是这里的SQL新手,我正在玩 UNIQUE 创建表时的约束。我显然不理解这里的一些基本内容,所以请耐心等待。

    假设我想强制要求用户必须具有唯一的用户名和唯一的电子邮件。换句话说,我不希望有两个用户拥有相同的用户名,也不希望两个用户有相同的电子邮件。

    我有一个 User 表定义如下:

    CREATE TABLE User 
    (
        id int,
        username nvarchar(20),
        email nvarchar(20),
        PRIMARY KEY (id),
        UNIQUE(username, email)
    );
    

    独特的 约束,则以下插入操作似乎将成功:

    INSERT INTO User (id, username, email)
    VALUES
        (1, 'aaron', 'aaron-email'),
        (2, 'aaron', 'aaron-email-2'),
        (3, 'bob', 'bob-email'),
        (4, 'bob', 'aaron-email');
    

    它强制要求用户名和电子邮件的组合必须是唯一的,才能使约束生效。然而,这显然没有意义,因为现在我们有多个用户使用相同的用户名,多个用户拥有相同的电子邮件。

    我们如何强制要求用户名和电子邮件列都必须是唯一的?

    1 回复  |  直到 3 年前
        1
  •  3
  •   Albina    3 年前

    一种语法 UNIQUE(username, email) 假设列的组合必须是唯一的。

    可以添加多个单独的UNIQUE约束,以对每个列强制执行唯一条件。您使用的语法允许使用多个语句:

    CREATE TABLE User (
        id int,
        username nvarchar(20),
        email nvarchar(20),
        PRIMARY KEY (id),
        UNIQUE(username),
        UNIQUE(email)
    );
    
    INSERT INTO User (id, username, email)
    VALUES
        (1, 'aaron', 'aaron-email'),
        (2, 'aaron', 'aaron-email-2'),
        (3, 'bob', 'bob-email'),
        (4, 'bob', 'aaron-email')
    ;
    
    Duplicate entry 'aaron' for key 'User.username'
    

    示例: https://dbfiddle.uk/07o7fr-C

    附言:同样的结果也可以通过另一种(更简单的)语法来实现,方法是添加 UNIQUE 列本身的限定符,例如:

    CREATE TABLE User (
        id int,
        username nvarchar(20) UNIQUE,
        email nvarchar(20) UNIQUE,
        PRIMARY KEY (id)
    );