我看到两种方法:
方法1:
CREATE TABLE IF NOT EXISTS `sample` (
`sample_id` tinyint(2) NOT NULL AUTO_INCREMENT,
`description` varchar(32) NOT NULL,
`parent_id` int(10) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`sample_id`)
) ENGINE=InnoDB;
ALTER TABLE sample ADD CONSTRAINT parent_id FOREIGN KEY (parent_id) REFERENCES parent_tbl(parent_id);
方法2:
CREATE TABLE IF NOT EXISTS `sample` (
`sample_id` tinyint(2) NOT NULL AUTO_INCREMENT,
`description` varchar(32) NOT NULL,
`parent_id` int(10) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`sample_id`),
Foreign Key (parent_id) references parent_tbl(parent_id)
) ENGINE=InnoDB;
哪种方式更好或何时使用其中一种?
答案 0 :(得分:2)
如果您需要将外键添加到现有表格,请使用方法1 ,如果您要从头开始创建架构,请使用方法2 。
没有最佳方式,他们做同样的事情。
答案 1 :(得分:0)
第一个为您提供更大的灵活性。
1)如果按顺序创建表,则需要使用第一种方法,以便在引用表之后创建引用表。如果你的引用中有循环,那么可能没有办法避免这种情况。如果没有循环,则存在一个订单,其中所有引用的表在其引用的表之前创建,但您可能不想花时间计算该订单是什么并重新排列脚本。
2)并非总是如此,您在创建表时确切知道需要哪些索引。在创建索引时,通常最好测量一些实际数据的性能增益,并尝试使用多个不同的索引来查看哪些更好。要使此策略起作用,您需要首先创建表,插入一些数据,然后您需要能够修改索引以进行测试。在这种情况下,删除和重新创建表不像ALTER TABLE那样实用。
除此之外没有任何差别,如果你从无到有,没有特别的理由支持一方而不是另一方。结果索引是相同的。
答案 2 :(得分:0)
最终产品难以区分。
为了清楚起见(很高兴看到约束明显地站在它自己身上),我可能会提倡第一个。
为了简洁(在1声明和2中说同样的话),我可能会提倡第二部分。