数据库表关系混乱的根本原因是未理解主键和外键约束逻辑;文章通过创建users主键表、orders外键表及验证操作,详解了主键唯一非空、外键引用规则与约束生效验证全过程。

数据库表之间关系混乱、数据重复、更新异常频发,根本原因是没搞懂主键和外键的约束逻辑。从创建表开始,一步步用真实SQL命令建立可验证的关联结构,让每条记录都有唯一身份、每次引用都受规则约束。
先建一张带主键的用户表
打开MySQL或PostgreSQL客户端,执行以下建表语句:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100)
);
主键字段必须非空且唯一,【AUTO_INCREMENT不能加在VARCHAR字段上】,否则插入时会报错。如果用PostgreSQL,把AUTO_INCREMENT换成SERIAL即可。
再建订单表并添加外键关联
方法一:建表时直接定义外键
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
方法二:建表后用ALTER添加外键
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10,2)
);
ALTER TABLE orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id);
注意:添加外键前,users表必须已存在且id字段有索引(主键自动建索引),否则MySQL会拒绝执行。
验证外键约束是否生效
第一步:向users表插入测试数据
INSERT INTO users (name, email) VALUES ('张三', 'zhang@example.com');
第二步:尝试插入一个合法订单
INSERT INTO orders (user_id, amount) VALUES (1, 99.9); —— 这条能成功
第三步:故意插入一个不存在的user_id
INSERT INTO orders (user_id, amount) VALUES (999, 50.0); —— 这条会报错,提示“Cannot add or update a child row”
第四步:删除users表中被引用的记录
DELETE FROM users WHERE id = 1; —— 默认情况下这条也会失败,因为orders表里还存着user_id=1的订单











