Mysql SQL中的主键和外键?

Mysql SQL中的主键和外键?,mysql,sql,Mysql,Sql,我不确定这一点,但我是否需要在SQL命令中显式创建外键 这家伙这么做的: CREATE TABLE languages ( lang_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, lang VARCHAR(60) NOT NULL, lang_eng VARCHAR(20) NOT NULL, PRIMARY KEY (lang_id), UNIQUE (lang) ); CREATE TABLE threads ( thread_id INT U

我不确定这一点,但我是否需要在SQL命令中显式创建外键

这家伙这么做的:

CREATE TABLE languages (
lang_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
lang VARCHAR(60) NOT NULL,
lang_eng VARCHAR(20) NOT NULL,
PRIMARY KEY (lang_id),
UNIQUE (lang)
);


CREATE TABLE threads (
thread_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
lang_id TINYINT(3) UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
subject VARCHAR(150) NOT NULL,
PRIMARY KEY  (thread_id),
INDEX (lang_id),
INDEX (user_id)
);
在这种情况下,是否意味着索引(lang_id)自动成为外键?我知道索引使搜索速度更快,但我不理解外键部分


如果您能回答我,我将不胜感激。不。索引就是。。。字段上的索引。一个外键告诉MySQL“这个特定字段必须在那边的表中有一个匹配的记录”

MySQL的内部设计要求所有用作外键的字段都要编制索引,但现代版本会自动为您创建索引

不管是谁,反之亦然。向字段添加索引不会将其转换为外键-外键定义还必须包括外键表/字段的内容,而简单的索引声明没有这些信息

对于示例表,您需要

...
INDEX (lang_id),
FOREIGN KEY (lang_id) REFERENCES languages (lang_id),
...

生成外键。

外键表示引用列中必须存在值。它不是自动的-您需要显式地编写它

FOREIGN KEY lang_id REFERENCES languages (lang_id)

不,必须显式声明外键

CREATE TABLE threads (
thread_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
lang_id TINYINT(3) UNSIGNED NOT NULL FOREIGN KEY FK_1 REFERENCES languages(lang_id),
user_id INT UNSIGNED NOT NULL,
subject VARCHAR(150) NOT NULL,
PRIMARY KEY  (thread_id),
INDEX (lang_id),
INDEX (user_id)
);

现在有两个表,其中包含主键和这些主键值的索引

如果需要,您可以停在这里,但您不会声明引用完整性来强制laguage和threads表之间的关系


要做到这一点,您需要显式创建外键关系,如下所述-

区别如下:-

  • 主键在具有多行的表中唯一地标识记录

  • 索引是一个通用术语,在此术语中,您可以为一个表创建多个索引,在这种情况下,数据库将根据您指定的列创建索引,以便在查询时,适当的索引将生效并更快地给出结果

  • 另一方面,外键表示表b中的该列是表A中的主列,因此每当您将行输入表b时,数据库将检查表A中是否存在指定的列/数据,否则将抛出错误


此答案中的一些错误处理/过度简化:一个
唯一的
约束(大写=关键字)也可能被外键引用,一个唯一约束(小写=逻辑,包括
主键
)可能包含多个列,一个表可能有多个唯一约束。