外键(Foreign Key)是一个数据库表中的列或一组列,它们用于建立和强化两个表之间的链接和关系。外键指向另一个表的主键,用于确保数据的一致性和完整性。通过外键,可以保证一个表中的值必须来源于另一个表中的主键值。
特点
- 引用完整性:外键约束确保被引用表中的值在引用表中存在。这意味着不能插入一个在被引用表中不存在的值。
- 级联操作:可以定义级联删除和级联更新,这样在被引用表中更新或删除记录时,引用表中的相关记录也会自动更新或删除。
- 数据一致性:通过外键,可以保证两个表之间的数据关系和一致性。
创建外键的SQL语法
-
在表创建时添加外键:
CREATE TABLE orders (order_id NUMBER PRIMARY KEY,customer_id NUMBER,order_date DATE,FOREIGN KEY (customer_id) REFERENCES customers(customer_id) );
-
在表创建后添加外键:
ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
-
设置外键时使用约束名:
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:使用单列外键
假设有两个表:customers
和 orders
。orders
表中的 customer_id
是 customers
表中 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:使用组合外键
假设有两个表:students
和 enrollment
。enrollment
表中的 student_id
和 course_id
是 students
表中 student_id
和 courses
表中 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)
);
级联操作示例
-
级联删除:当被引用表的记录被删除时,引用表中的相关记录也会自动删除。
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 );
-
级联更新:当被引用表的记录被更新时,引用表中的相关记录也会自动更新。
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 );
注意事项
- 数据一致性:确保引用的值必须存在于被引用表中。
- 性能影响:外键约束会影响插入、更新和删除操作的性能,因为数据库需要检查引用完整性。
- 循环引用:避免表之间的循环引用,这会导致复杂的级联删除或更新操作。
通过外键约束,可以确保数据库中的数据关系和完整性,避免出现孤立或不一致的数据。