详解Oracle添加唯一约束 ?

参考回答

在Oracle中,唯一约束(UNIQUE Constraint)用于确保列中的每个值是唯一的。它类似于主键约束,但不同之处在于唯一约束允许列包含空值(NULL),而主键约束不允许空值。

语法:

  1. 在创建表时添加唯一约束
    CREATE TABLE table_name (
       column1 datatype,
       column2 datatype,
       CONSTRAINT constraint_name UNIQUE (column1)
    );
    
    SQL
  2. 在现有表中添加唯一约束
    ALTER TABLE table_name
    ADD CONSTRAINT constraint_name UNIQUE (column1);
    
    SQL

示例:

假设你有一个 employees 表,其中 email 列应具有唯一约束,确保每个员工的电子邮件地址不重复。可以使用以下 SQL 语句:

  1. 创建表时添加唯一约束
    CREATE TABLE employees (
       employee_id NUMBER PRIMARY KEY,
       name VARCHAR2(100),
       email VARCHAR2(100),
       CONSTRAINT unique_email UNIQUE (email)
    );
    
    SQL
  2. 向现有表添加唯一约束
    ALTER TABLE employees
    ADD CONSTRAINT unique_email UNIQUE (email);
    
    SQL

详细讲解与拓展

  1. 唯一约束的功能
    • 唯一性:唯一约束确保列中的每个值都是唯一的。这意味着没有两行数据可以具有相同的值,除非该列的值为 NULL
    • NULL值的处理:与主键约束不同,唯一约束允许列中存在 NULL 值。多个 NULL 值可以出现在唯一约束的列中,因为 NULL 被认为是不可比较的,因此多个 NULL 值不会违反唯一性。

    例如,考虑以下情况:

    CREATE TABLE test_table (
       id NUMBER,
       email VARCHAR2(100),
       CONSTRAINT unique_email UNIQUE (email)
    );
    
    SQL

    如果向 test_table 中插入以下数据:

    INSERT INTO test_table (id, email) VALUES (1, 'user1@example.com');
    INSERT INTO test_table (id, email) VALUES (2, 'user2@example.com');
    INSERT INTO test_table (id, email) VALUES (3, NULL);
    INSERT INTO test_table (id, email) VALUES (4, NULL);
    
    SQL

    这里的 NULL 值不会违反唯一约束,因为 NULL 在Oracle中是不可比较的。

  2. 使用约束名称
    在创建唯一约束时,您可以选择为约束指定一个名称。这是一个良好的实践,因为为约束命名使得管理和调试时更加方便。如果没有显式指定名称,Oracle会为约束自动生成一个默认名称。

    例子

    ALTER TABLE employees
    ADD CONSTRAINT unique_email UNIQUE (email);
    
    SQL

    这里,unique_email 是约束的名称。如果不指定,Oracle会自动生成一个类似于 SYS_C123456 的名称。

  3. 多列唯一约束
    在多个列上添加唯一约束时,唯一性会根据多个列的组合来判断。例如,下面的约束确保了 emailphone_number 的组合在表中是唯一的。

    例子

    ALTER TABLE employees
    ADD CONSTRAINT unique_email_phone UNIQUE (email, phone_number);
    
    SQL

    在这个例子中,emailphone_number 的组合必须是唯一的,但允许相同的 email 与不同的 phone_number 配合,或者相同的 phone_number 与不同的 email 配合。

  4. 唯一约束与索引
    当你为列添加唯一约束时,Oracle会自动创建一个唯一索引,以确保数据的唯一性。这个索引可以加速基于该列的查询和数据操作。你可以使用 ALL_INDEXESUSER_INDEXES 视图查看由唯一约束自动创建的索引。

  5. 删除唯一约束
    如果你不再需要唯一约束,可以使用 ALTER TABLE 删除它。你需要指定约束的名称。

    例子

    ALTER TABLE employees
    DROP CONSTRAINT unique_email;
    
    SQL

    这会删除 unique_email 约束及其自动创建的唯一索引。

  6. 唯一约束与主键的区别

    • 主键约束:主键约束是唯一约束的一种特殊情况。主键列不允许有 NULL 值,并且主键约束自动创建一个唯一索引。
    • 唯一约束:唯一约束允许列中有多个 NULL 值,并且不会强制要求列必须唯一的每个值都不能为空。

总结:Oracle中的唯一约束用于确保列中的数据唯一。它支持多个列组合的唯一性,并且允许NULL值。唯一约束通过自动创建唯一索引来加速查询。与主键约束不同,唯一约束允许列中有多个NULL值。唯一约束可以在创建表时定义,也可以在表已经存在时通过ALTER TABLE命令添加或删除。

发表评论

后才能评论