在MySQL中定义外键的方法

时间:2010-12-22 02:57:09

标签: mysql database schema

我看到两种方法:

方法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;  

哪种方式更好或何时使用其中一种?

3 个答案:

答案 0 :(得分:2)

如果您需要将外键添加到现有表格,请使用方法1 ,如果您要从头开始创建架构,请使用方法2

没有最佳方式,他们做同样的事情。

答案 1 :(得分:0)

第一个为您提供更大的灵活性。

1)如果按顺序创建表,则需要使用第一种方法,以便在引用表之后创建引用表。如果你的引用中有循环,那么可能没有办法避免这种情况。如果没有循环,则存在一个订单,其中所有引用的表在其引用的表之前创建,但您可能不想花时间计算该订单是什么并重新排列脚本。

2)并非总是如此,您在创建表时确切知道需要哪些索引。在创建索引时,通常最好测量一些实际数据的性能增益,并尝试使用多个不同的索引来查看哪些更好。要使此策略起作用,您需要首先创建表,插入一些数据,然后您需要能够修改索引以进行测试。在这种情况下,删除和重新创建表不像ALTER TABLE那样实用。

除此之外没有任何差别,如果你从无到有,没有特别的理由支持一方而不是另一方。结果索引是相同的。

答案 2 :(得分:0)

最终产品难以区分。

为了清楚起见(很高兴看到约束明显地站在它自己身上),我可能会提倡第一个。

为了简洁(在1声明和2中说同样的话),我可能会提倡第二部分。