我不确定这一点,但是我是否需要在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使搜索更快,但我不了解关于外键的部分
我真的很感激任何答案
答案 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否则会抛出错误。