【问题标题】:MySQL Foreign key definition?MySQL外键定义?
【发布时间】:2012-11-17 07:11:21
【问题描述】:

我在玩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)
);

这两者有什么区别?它们是否相同,只是您喜欢如何编写的偏好问题?还是有什么不同?

【问题讨论】:

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


【解决方案1】:

FOREIGN KEY Constraints 中所述:

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

[CONSTRAINT [symbol]] 外键
    [index_name](index_col_name,...)
    参考 tbl_nameindex_col_name,...)
    [删除 reference_option]
    [正在更新 reference_option]

reference_option:
    限制 |级联 |设置为空 |无动作

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

外键定义需满足以下条件:

[ deletia ]

  • 如果给出了CONSTRAINT <strong><em>symbol</em></strong> 子句,则symbol 值在数据库中必须是唯一的。如果没有给出子句,InnoDB 会自动创建名称。

[ deletia ]

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

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

除此之外,它们是相同的。

【讨论】:

  • @Waldermort:这几乎完全是从手册中引用的......:/
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多