我正在使用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)
);
这两者有什么区别?它们是否相同,只是您喜欢写作的偏好?或者有一些差异?
答案 0 :(得分:2)
CREATE TABLE
或ALTER 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
的外键约束,其中包含一个自动生成的索引名称(如果尚未存在)。
除此之外,它们完全相同。