一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
本例中,有一张学生表和一张选课表。
学生表(students_tbl):
CREATE TABLE students_tbl(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
schllo VARCHAR(40) NOT NULL,
PRIMARY KEY ( id )
);
+----+--------+--------------+
| id | name | school |
+----+--------+--------------+
| 1 | 小李 | 北京大学 |
| 2 | 小刘 | 中山大学 |
| 3 | 小张 | 清华大学 |
+----+--------+--------------+
选课表(subject_tbl):
CREATE TABLE subject_tbl(
id INT NOT NULL AUTO_INCREMENT,
subject_name VARCHAR(100) NOT NULL,
students_id INT NOT NULL,
PRIMARY KEY ( id ),
FOREIGN KEY (students_id) REFERENCES students_tbl(id)
);
+----+--------------+-------------+
| id | subject_name | students_id |
+----+--------------+-------------+
| 1 | C++ | 1 |
| 3 | Python | 2 |
| 4 | Java | 3 |
+----+--------------+-------------+
选课表(subject_tbl)中的 students_id 指向学生表(students_tbl)中的 id。
students_id 为选课表(subject_tbl)的外键(FOREIGN KEY)。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
现在我们尝试插入一个非法的值:
mysql> INSERT INTO subject_tbl
-> (subject_name, students_id)
-> VALUES
-> ("Java", 10);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key
constraint fails (`test`.`subject_tbl`, CONSTRAINT `subject_tbl_ibfk_1`
FOREIGN KEY (`students_id`) REFERENCES `students_tbl` (`id`))
可以看到外键约束的生效。