主键(Primary Key)是数据库表中的一个或多个列,它们的值唯一地标识表中的每一行。主键具有以下特点:

  1. 唯一性(Uniqueness):主键的每个值在表中必须是唯一的,不能重复。
  2. 非空性(Not Null):主键列的值不能为空(NULL)。
  3. 单一性(Single Column or Composite Key):主键可以是单个列,也可以是由多个列组成的组合键(Composite Key)。

主键的作用主要是确保数据的完整性和唯一性,并且在数据库操作(如查找、更新、删除)中提高效率。

创建主键的SQL语法

  1. 单列主键

    CREATE TABLE employees (
        employee_id NUMBER PRIMARY KEY,
        first_name VARCHAR2(50),
        last_name VARCHAR2(50)
    );
    
  2. 组合主键

    CREATE TABLE order_items (
        order_id NUMBER,
        item_id NUMBER,
        quantity NUMBER,
        PRIMARY KEY (order_id, item_id)
    );
    
  3. 在表创建后添加主键

    ALTER TABLE employees ADD CONSTRAINT pk_employee_id PRIMARY KEY (employee_id);
    
  4. 设置主键时使用约束名

    CREATE TABLE products (
        product_id NUMBER,
        product_code VARCHAR2(50),
        product_name VARCHAR2(100),
        CONSTRAINT pk_product PRIMARY KEY (product_id)
    );
    

主键示例

示例1:使用单列主键
CREATE TABLE customers (
    customer_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50) NOT NULL,
    last_name VARCHAR2(50) NOT NULL,
    email VARCHAR2(100)
);

在这个示例中,customer_id列被定义为主键,它唯一标识每个客户,并且不能为空。

示例2:使用组合主键
CREATE TABLE enrollment (
    student_id NUMBER,
    course_id NUMBER,
    enrollment_date DATE,
    PRIMARY KEY (student_id, course_id)
);

在这个示例中,student_idcourse_id的组合被定义为主键,这意味着每个学生在同一个课程中只能有一条记录。

示例3:在表创建后添加主键
CREATE TABLE departments (
    dept_id NUMBER,
    dept_name VARCHAR2(100) NOT NULL
);

ALTER TABLE departments ADD CONSTRAINT pk_dept_id PRIMARY KEY (dept_id);

在这个示例中,表创建后使用ALTER TABLE语句添加了主键约束。

注意事项

  • 唯一性保证:主键列的值必须是唯一的。如果尝试插入重复的主键值,数据库将返回错误。
  • 非空性保证:主键列不能为空。如果尝试插入NULL值,数据库将返回错误。
  • 自动递增:在某些数据库中,可以将主键列设置为自动递增(AUTO_INCREMENT),以自动生成唯一的主键值。例如,在Oracle中可以使用序列来实现这一点:
    CREATE SEQUENCE customer_seq START WITH 1 INCREMENT BY 1;
    
    CREATE TABLE customers (
        customer_id NUMBER PRIMARY KEY,
        first_name VARCHAR2(50) NOT NULL,
        last_name VARCHAR2(50) NOT NULL,
        email VARCHAR2(100)
    );
    
    INSERT INTO customers (customer_id, first_name, last_name, email) VALUES (customer_seq.NEXTVAL, 'John', 'Doe', 'john.doe@example.com');
    

通过合理使用主键,可以确保数据库中的数据具有高一致性和完整性,并且在进行数据操作时具有高效的访问性能。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐