如何将表的外键引用从一个表修改为另一个表?
修改外键引用到新表的正确操作步骤
你写的ALTER TABLE语句语法不对,绝大多数数据库都不支持直接修改外键的引用目标,得先删掉原来的外键约束,再重新添加指向新表的外键。
1. 先找到原外键的约束名
不同数据库查约束名的语句不一样,给你几个常用的:
- MySQL:
SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'tablename' AND COLUMN_NAME = 'Columnname' AND REFERENCED_TABLE_NAME IS NOT NULL; - PostgreSQL:
SELECT conname FROM pg_constraint WHERE conrelid = 'tablename'::regclass AND conkey @> ARRAY[(SELECT attnum FROM pg_attribute WHERE attrelid='tablename'::regclass AND attname='Columnname')] AND contype = 'f'; - SQL Server:
SELECT name FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID('tablename') AND EXISTS ( SELECT 1 FROM sys.foreign_key_columns fkc WHERE fkc.constraint_object_id = sys.foreign_keys.object_id AND fkc.parent_column_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('tablename') AND name = 'Columnname') );
2. 删除原外键约束
假设查到的约束名叫old_fk_constraint,执行删除:
ALTER TABLE tablename DROP FOREIGN KEY old_fk_constraint;
(SQL Server里要写成ALTER TABLE tablename DROP CONSTRAINT old_fk_constraint;)
3. 添加新的外键约束
现在添加指向新表的外键,自己给新外键起个名字(比如new_fk_constraint):
ALTER TABLE tablename ADD CONSTRAINT new_fk_constraint FOREIGN KEY (Columnname) REFERENCES new_table(column_name);
把new_table换成你要引用的目标表名即可。
为啥你原来的语句不行?
你的写法不符合ALTER TABLE的语法规范:
- 缺少
ADD CONSTRAINT关键字,外键约束要么显式命名,要么让数据库自动生成,但不能直接写列名加FOREIGN KEY - 正确的外键添加结构必须是
ADD CONSTRAINT [约束名] FOREIGN KEY (列名) REFERENCES 目标表(目标列)
内容的提问来源于stack exchange,提问作者n1T1n yadav
相关产品推荐
相关产品推荐

