Unique约束指定受约束列中的每个非NULL值必须唯一。

细节

如果需要严格执行唯一性,请在Unique约束之外使用Not Null约束。 你还可以通过表的主键实现相同的功能。

语法

可以在表级定义唯一约束,不过如果你希望将约束应用于单个列,也可以在列级别应用该约束。

列级别

图片

Parameter Description
table_name 表名
column_name 添加约束的列名
column_type 受约束列的数据类型
column_constraints 要应用于此列的任何其他列级约束。
column_def 表中任何其他列的定义。
table_constraints 要应用的任何表级约束。

举例

> CREATE TABLE warehouses (
    warehouse_id    INT        PRIMARY KEY NOT NULL,
    warehouse_name  STRING(35) UNIQUE,
    location_id     INT
  );

表级别

图片

Parameter Description
table_name 表名
column_def 表中任何其他列的定义。
name 约束名, 需要在表中唯一,并且符合identifier rules.
column_name 受约束列的名称
table_constraints 要应用的任何表级约束。

举例

> CREATE TABLE logon (
    login_id  INT PRIMARY KEY, 
    customer_id   INT,
    logon_date    TIMESTAMP,
    UNIQUE (customer_id, logon_date)
  );

用法示例

> CREATE TABLE IF NOT EXISTS logon (
    login_id INT PRIMARY KEY, 
    customer_id   INT NOT NULL,
    sales_id INT,
    UNIQUE (customer_id, sales_id)
  );

> INSERT INTO logon (login_id, customer_id, sales_id) VALUES (1, 2, 1);

> INSERT INTO logon (login_id, customer_id, sales_id) VALUES (2, 2, 1);
duplicate key value (customer_id,sales_id)=(2,1) violates unique constraint "logon_customer_id_sales_id_key"

如上面详细介绍中所述,单独使用Unique约束时,可以插入多个NULL值虽然这看起来像是重复值。

> INSERT INTO logon (login_id, customer_id, sales_id) VALUES (3, 2, NULL);

> INSERT INTO logon (login_id, customer_id, sales_id) VALUES (4, 2, NULL);

> SELECT customer_id, sales_id FROM logon;
+-------------+----------+
| customer_id | sales_id |
+-------------+----------+
|           2 |        1 |
|           2 | NULL     |
|           2 | NULL     |
+-------------+----------+

See Also