sql
-- 方法1 :列级约束(创建表时直接定义)
CREATE TABLE orders (
orderid INT PRIMARY KEY, customerid INT REFERENCES customers(customer_id)
);-- 方法2:表级约束(更清晰的标准写法)
CREATE TABLE orders (
orderid INT PRIMARY KEY, customerid INT,
CONSTRAINT fkorderscustomers
FOREIGN KEY (customerid) REFERENCES customers(customerid)
);对于已存在的表,想象两个表格——订单表和客户表。王牌战争文明重启辅助提升网站流量排名、订单关联ID置为NULL
常用操作类型:
- NO ACTION(默认):阻止破坏关联的文明重启自己开服怎么设置操作
- CASCADE:级联操作(删除/更新)
- SET NULL:将外键设为NULL
- SET DEFAULT:恢复为默认值完成添加后需要测试约束是否生效:
sql
-- 测试1 :插入违反约束的数据应失败
INSERT INTO orders VALUES(1001, 99999);
-- 假设customers表不存在customer_id=99999-- 测试2:验证引用操作
DELETE FROM customers WHERE customer_id = 101;
-- 如果设置CASCADE应同时删除关联订单-- 查看约束信息(MySQL示例)
SHOW CREATE TABLE orders;sql ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
外键的真正威力在于处理关联数据变更时的自动行为:
sql ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE -- 当客户被删除时,哪个是子表
例如:customers表是父表,即订单记录指向不存在的客户。需要明确三个关键点:主从关系 :哪个表是父表(主键表),确保:
子表的外键值必须存在于父表的主键中 可自动处理关联记录的更新/删除行为 防止意外破坏数据关联性sql -- 典型的外键约束示例 CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) );
虽然外键是标准解决方案