我想更改一个名为person的表,并希望使用office
表
我正在使用的查询是
ALTER TABLE person
ADD CONSTRAINT person_Office_FK
FOREIGN KEY ( Office_id )
REFERENCES Office ( Office_id ) ;
表office
有大约500,000行,表person
大约有500万行
此查询将永远存在,我不确定发生了什么。
答案 0 :(得分:2)
您可以使用:
SET FOREIGN_KEY_CHECKS=0;
我通常会在执行此操作之前执行自己的外键检查:
SELECT
Person.*
FROM person
LEFT JOIN Office ON (person.Office_id = Office.Office_id)
WHERE Office.Office_id IS NULL
;
如果您可以安全地关闭FOREIGN_KEY_CHECKS,该查询应该不返回任何内容。
答案 1 :(得分:1)
如果Office_id
是Office
的主键,请确保它具有(主键)索引。这肯定会加速约束的添加。
另外,根据How to temporarily disable a foreign key constraint in MySQL?,您可以使用
SET FOREIGN_KEY_CHECKS=0;
要禁用所有外键约束检查,添加它们时可能也会这样做。
答案 2 :(得分:1)
在添加约束之前,请确保office表上的office_id上有聚簇索引,person表上的office_id上有非聚集索引。
请记住,person表上每次出现的office_id都需要检查每个office_id记录。如果您必须删除办公室记录,这也会加快速度。
您不希望禁用这些检查,因为您的约束将不受信任,并且您将无法获得外键在查询优化器中为您提供的性能优势。
答案 3 :(得分:1)
问题仍然没有过时。我在这里遇到了同样的问题,并通过5个步骤找到了解决方法:
复制表格:CREATE TABLE table2 LIKE table1;
应用约束外键:ALTER TABLE..FOREIGN.... bla bla bla
将数据从表1转储到表2:INSERT INTO table2 SELECT * FROM table1;
删除表1:DROP TABLE table1;
重命名表2:RENAME TABLE table2 TO table1;
所有合一:
CREATE TABLE table2 LIKE table1;
ALTER TABLE..FOREIGN.... bla bla bla;
INSERT INTO table2 SELECT * FROM table1;
DROP TABLE table1;
RENAME TABLE table2 TO table1;