在MySQL表中指定约束

在MySQL表中指定约束,mysql,foreign-keys,constraints,Mysql,Foreign Keys,Constraints,我正在为我的系统设计数据库。有很多外键约束 我想知道我是否能得到一些建议,我是否应该做以下哪一项: 1) 在表格创建过程中指定约束,即 CREATE TABLE IF NOT EXISTS abc ( keyword VARCHAR(20) NOT NULL, id INT UNSIGNED NOT NULL, FOREIGN KEY (id) REFERENCES xyz(id) ON DELETE CASCADE ON UPDATE CASCADE )

我正在为我的系统设计数据库。有很多外键约束

我想知道我是否能得到一些建议,我是否应该做以下哪一项:

1) 在表格创建过程中指定约束,即

CREATE TABLE IF NOT EXISTS abc
    (
    keyword VARCHAR(20) NOT NULL,
    id INT UNSIGNED NOT NULL,
    FOREIGN KEY (id) REFERENCES xyz(id) ON DELETE CASCADE ON UPDATE CASCADE
    )ENGINE=InnoDB;
2) 创建不带FK约束的表,并在以后的ie上“更改”该表

CREATE TABLE IF NOT EXISTS abc
    (
    keyword VARCHAR(20) NOT NULL,
    id INT UNSIGNED NOT NULL,
    )ENGINE=InnoDB;
ALTER TABLE abc ADD CONSTRAINT fk_constraint FOREIGN KEY (id) REFERENCES xyz(id)
ON DELETE CASCADE ON UPDATE CASCADE;

表xyz只是另一个以“id”作为主键的表。

结果将是相同的。因此,没有区别

若我创建新数据库,我将在一条语句中创建表及其外键。脚本看起来会更好。但在这种情况下,必须在子表之前创建父表


如果在创建表时不想考虑依赖关系,可以在脚本开头以随机顺序创建表,然后使用ALTER TABLE添加外键。

您可以立即创建FK。但这并不总是可能的,因为它们可以以循环的方式相互引用。此外,您可能希望稍后使用FK添加列


一次添加它可能会稍微快一些,因为MySQL必须验证并重新生成表结构以进行某些更改(尽管我不确定添加FKs是否是其中之一)。但是这个过程在空表上会相当快,所以在添加FK时没有多大关系

嗯。我明白了。如果我们提前声明FK,则会有性能方面的问题。谢谢我现在明白了。谢谢!