MySQL外键定义?

时间:2012-11-29 08:51:22

标签: mysql database foreign-keys relational-database foreign-key-relationship

我正在使用mysql,我发现了两种定义外键的方法:

CREATE TABLE posts(
    id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    post_title VARCHAR(255) NOT NULL,
    PRIMARY KEY(id),
    FOREIGN KEY name (user_id) REFERENCES users(id)
);

CREATE TABLE posts(
    id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    post_title VARCHAR(255) NOT NULL,
    PRIMARY KEY(id),
    CONSTRAINT name
        FOREIGN KEY(user_id) 
        REFERENCES users(id)
);

这两者有什么区别?它们是否相同,只是您喜欢写作的偏好?或者有一些差异?

1 个答案:

答案 0 :(得分:2)

正如FOREIGN KEY Constraints所述:

  

CREATE TABLEALTER TABLE语句中InnoDB外键约束定义的语法如下所示:

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION
     

index_name 表示外键ID。如果给定,则在显式定义外键的索引时忽略该值。否则,如果InnoDB为外键创建索引,则会使用 index_name 作为索引名称。

     

外键定义符合以下条件:

     

[ deletia ]

     
      
  • 如果提供了CONSTRAINT symbol子句, symbol 值在数据库中必须是唯一的。如果未给出该子句,InnoDB会自动创建名称。
  •   
     

[ deletia ]

     

如果FOREIGN KEY子句在创建外键时包含CONSTRAINT名称,则可以引用该名称来删除外键。否则, fk_symbol 值会在创建外键时由InnoDB在内部生成。

因此,您的第一个示例使用名为name的索引创建一个自动命名的外键约束(如果尚不存在);而您的第二个示例创建了一个名为name的外键约束,其中包含一个自动生成的索引名称(如果尚未存在)。

除此之外,它们完全相同。