我有两个已经存在的表,(部分)大致如下:
CREATE TABLE parent (
old_pk CHAR(8) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE child (
parent_key CHAR(8),
FOREIGN KEY (parent_key) REFERENCES parent(old_pk)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
我想在parent
中添加一个新的自动递增整数id
列,并将其用作主键,同时仍然将old_pk
作为唯一键,并允许其他表(如child
)在外键约束中引用它。
错误代码:1025
将. "/data/# sql-4013_70f5e "重命名为. "/data/parent"时出错(错误号:150)
一些Google搜索表明这是由于child
中现有的外键引用。本质上,我需要一种方法来告诉MySQL "使用另一列作为主键,但不要忘记原始列的唯一键性"。除了从child
中删除键约束并在以后恢复它们之外,还有什么方法可以实现这一点吗?
假设我必须在适当的位置修改表,而不是用相同的数据创建副本并在以后交换它们,我在修改表之前尝试过使用SET FOREIGN_KEY_CHECKS = 0
,但似乎没有帮助。
2条答案
按热度按时间vzgqcmou1#
在删除主键之前,给old_pk添加一个索引(它甚至可以是UNIQUE):
7cwmlq892#
在我工作过的商店里,流行的观点是:不要在数据库中使用外键约束--根据需要通过TSQL在存储过程中强制执行唯一键和其他约束。根据我的经验,在可伸缩的环境中很少使用检查约束。
在我从事关系数据库工作的10年左右的时间里,我认识的唯一使用检查约束的人都是在规模不大的系统上工作。