【问题标题】:Which way to define foreign keys in MySQLMySQL中定义外键的方法
【发布时间】:2012-09-24 23:54:00
【问题描述】:

我看到了两种方法:

方法一:

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);  

方法二:

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;  

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

【问题讨论】:

    标签: mysql database schema


    【解决方案1】:

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

    没有最好的方法,他们做同样的事情。

    【讨论】:

      【解决方案2】:

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

      1) 如果按顺序创建表,即在引用表之后创建被引用表,则需要使用第一种方法。如果您的参考文献中有循环,那么可能没有办法避免这种情况。如果没有循环,则存在一个顺序,即所有引用的表都在其引用的表之前创建,但您可能不想花时间弄清楚该顺序是什么并重新排列脚本。

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

      除此之外没有任何区别,如果您从零开始,则没有特别的理由偏爱其中一个。结果索引是相同的。

      【讨论】:

        【解决方案3】:

        最终产品无法区分。

        为了清楚起见(很高兴看到约束明确地独立存在),我可能会提倡第一个。

        为了简洁(在 1 条语句和 2 条语句中说同样的话),我可能会提倡使用第二条语句。

        【讨论】:

          猜你喜欢
          • 2015-04-16
          • 2012-11-17
          • 2010-11-19
          • 2010-11-10
          • 2020-07-10
          • 1970-01-01
          • 1970-01-01
          • 2013-09-23
          相关资源
          最近更新 更多