如何为已创建并插入数据的表添加外键?
已插数据的表补加外键&修复关联查询指南
1. 先检查关联数据的合法性
加外键前,得确认关联表(存关联数据的那张)里的id值全在主键表的id列里有对应,不然外键根本加不上。跑下面的SQL查有没有无效数据:
-- 把table_name换成你的关联表名,primary_table换成主键表名 SELECT t.id FROM table_name t LEFT JOIN primary_table pt ON t.id = pt.id WHERE pt.id IS NULL;
如果查出来有结果,说明关联表里有主键表不存在的id,得先清掉这些无效数据(建议先备份表再删):
DELETE FROM table_name WHERE id NOT IN (SELECT id FROM primary_table);
2. 补加外键约束
数据没问题后,用ALTER TABLE语句加外键:
-- 替换对应表名和字段名:table_name=关联表,foreign_key_column=关联表的关联字段(这里是id),primary_table=主键表,primary_key_column=主键表的主键(这里是id) ALTER TABLE table_name ADD CONSTRAINT fk_table_name_primary_table FOREIGN KEY (foreign_key_column) REFERENCES primary_table(primary_key_column);
要是你的关联字段不是id(比如叫main_id),记得换成实际的字段名。
3. 修复关联查询的问题
其实外键是管数据完整性的,和查询能不能跑没直接关系——之前查不了大概率是SQL写得有问题。给你两个常用的关联查询示例:
-- 内连接:只返回两边都匹配上的数据 SELECT pt.*, t.* FROM primary_table pt JOIN table_name t ON pt.id = t.id; -- 左连接:返回主键表所有数据,关联表有匹配的就显示,没有就显示NULL SELECT pt.*, t.* FROM primary_table pt LEFT JOIN table_name t ON pt.id = t.id;
要是之前的查询报错,先检查表名、字段名有没有拼错,或者是不是用错了连接方式。
内容的提问来源于stack exchange,提问作者Saad Makandar
相关产品推荐
相关产品推荐

