SQL中的主键和外键?

时间:2011-10-24 21:22:09

标签: 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 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)
);

在这种情况下,是否意味着INDEX(lang_id)会自动变为FOREIGN KEY?我知道INDEX使搜索更快,但我不了解关于外键的部分

我真的很感激任何答案

5 个答案:

答案 0 :(得分:2)

没有。索引就是......字段上的索引。外键告诉MySQL“这个特定的字段必须在那个表中有匹配的记录”。

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

反过来说,不管是谁。向字段添加索引不会将其转换为外键 - 外键定义还必须包括外部表/字段的内容,并且简单的索引声明不包含该信息。

对于您的样本表,您需要

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

生成外键。

答案 1 :(得分:1)

外键表示值必须存在于引用的列中。它不是自动的 - 你需要明确地写它。

FOREIGN KEY lang_id REFERENCES languages (lang_id)

答案 2 :(得分:1)

不必显式声明外键

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

答案 3 :(得分:1)

您现在拥有的是两个主键和主键值索引的表。

如果你愿意,你可以在这里停止,但你没有声明参照完整性,强制执行laguage和threads表之间的关系。

为此,您将明确创建外键关系,如此处所述 - http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

答案 4 :(得分:1)

差异如下: -

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

  • 索引是一个通用术语,您可以在其中为表创建多个索引,在这种情况下,数据库会根据您指定的列创建索引,以便在查询相应的索引时踢进去,给你更快的结果。

  • 另一方面,外键表示表b中的这一列是表A中的主列,因此无论何时在表B中输入行,数据库都将检查指定的列/数据是否存在于表A否则会抛出错误。