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 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 使搜索速度更快,但我不明白有关外键的部分

非常感谢您的回答

最佳答案

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

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

反之则不然。向字段添加索引不会将其变成外键 - 外键定义还必须包括外表/字段是什么,而简单的索引声明没有这些信息。

对于您的示例表,您需要有

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

生成外键。

关于mysql - SQL中的主键和外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7882148/

相关文章:

mysql - 基于角色的访问控制的数据库架构

php - MYsql 与存在语句的联合

MySQL加入SELECT COUNT()

sql - 定义可变长度的varchar

mysql - 如何从带有空表的mysql导出数据库?

php session id值到多个页面

php - phpMyAdmin 的 20,000 行限制的修复或迁移是什么?有什么真正不稳定的地方吗?

sql - 如何在 SQL Server 中更新表并添加列值?

SQL素数函数

.net - 如何计算满足和不满足条件的记录数量