Oracle(13)什么是外键(Foreign Key)?

发布于:2024-07-26 ⋅ 阅读:(113) ⋅ 点赞:(0)

外键(Foreign Key)是一个数据库表中的列或一组列,它们用于建立和强化两个表之间的链接和关系。外键指向另一个表的主键,用于确保数据的一致性和完整性。通过外键,可以保证一个表中的值必须来源于另一个表中的主键值。

特点

  1. 引用完整性:外键约束确保被引用表中的值在引用表中存在。这意味着不能插入一个在被引用表中不存在的值。
  2. 级联操作:可以定义级联删除和级联更新,这样在被引用表中更新或删除记录时,引用表中的相关记录也会自动更新或删除。
  3. 数据一致性:通过外键,可以保证两个表之间的数据关系和一致性。

创建外键的SQL语法

  1. 在表创建时添加外键

    CREATE TABLE orders (
        order_id NUMBER PRIMARY KEY,
        customer_id NUMBER,
        order_date DATE,
        FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );
    
  2. 在表创建后添加外键

    ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
    
  3. 设置外键时使用约束名

    CREATE TABLE orders (
        order_id NUMBER PRIMARY KEY,
        customer_id NUMBER,
        order_date DATE,
        CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );
    

外键示例

示例1:使用单列外键

假设有两个表:customersordersorders 表中的 customer_idcustomers 表中 customer_id 的外键。

-- 创建 customers 表
CREATE TABLE customers (
    customer_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50) NOT NULL,
    last_name VARCHAR2(50) NOT NULL,
    email VARCHAR2(100)
);

-- 创建 orders 表并添加外键约束
CREATE TABLE orders (
    order_id NUMBER PRIMARY KEY,
    customer_id NUMBER,
    order_date DATE,
    CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
示例2:使用组合外键

假设有两个表:studentsenrollmentenrollment 表中的 student_idcourse_idstudents 表中 student_idcourses 表中 course_id 的外键。

-- 创建 students 表
CREATE TABLE students (
    student_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50) NOT NULL,
    last_name VARCHAR2(50) NOT NULL
);

-- 创建 courses 表
CREATE TABLE courses (
    course_id NUMBER PRIMARY KEY,
    course_name VARCHAR2(100) NOT NULL
);

-- 创建 enrollment 表并添加组合外键约束
CREATE TABLE enrollment (
    student_id NUMBER,
    course_id NUMBER,
    enrollment_date DATE,
    PRIMARY KEY (student_id, course_id),
    CONSTRAINT fk_student FOREIGN KEY (student_id) REFERENCES students(student_id),
    CONSTRAINT fk_course FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

级联操作示例

  1. 级联删除:当被引用表的记录被删除时,引用表中的相关记录也会自动删除。

    CREATE TABLE orders (
        order_id NUMBER PRIMARY KEY,
        customer_id NUMBER,
        order_date DATE,
        CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
    );
    
  2. 级联更新:当被引用表的记录被更新时,引用表中的相关记录也会自动更新。

    CREATE TABLE orders (
        order_id NUMBER PRIMARY KEY,
        customer_id NUMBER,
        order_date DATE,
        CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON UPDATE CASCADE
    );
    

注意事项

  • 数据一致性:确保引用的值必须存在于被引用表中。
  • 性能影响:外键约束会影响插入、更新和删除操作的性能,因为数据库需要检查引用完整性。
  • 循环引用:避免表之间的循环引用,这会导致复杂的级联删除或更新操作。

通过外键约束,可以确保数据库中的数据关系和完整性,避免出现孤立或不一致的数据。


网站公告

今日签到

点亮在社区的每一天
去签到