alter table query需要太长时间才能添加约束

时间:2014-08-07 19:55:51

标签: mysql sql

我想更改一个名为person的表,并希望使用office

为其添加外键

我正在使用的查询是

ALTER TABLE person
ADD CONSTRAINT person_Office_FK
FOREIGN KEY ( Office_id )
REFERENCES Office ( Office_id ) ;

office有大约500,000行,表person大约有500万行

此查询将永远存在,我不确定发生了什么。

4 个答案:

答案 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_idOffice的主键,请确保它具有(主键)索引。这肯定会加速约束的添加。

另外,根据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个步骤找到了解决方法:

  1. 复制表格:CREATE TABLE table2 LIKE table1;

  2. 应用约束外键:ALTER TABLE..FOREIGN.... bla bla bla

  3. 将数据从表1转储到表2:INSERT INTO table2 SELECT * FROM table1;

  4. 删除表1:DROP TABLE table1;

  5. 重命名表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;