外键
在设计关系表时,如果有些数据冗余的,那么就可以考虑外键。比如一张记录学生信息的表,每行表示一个学生,记录了学生自己的信息,以及其所在学院的信息,比如学院名、学院的位置、学院老师数量等等。这里可能存在多个学生是同一个学院的,那么学院的信息就会冗余。此时应该将学院的信息抽出来独立成一张表,并在学生信息表中增加一列来记录学院信息表中对应的学院,此时就不会有冗余的情况了。
外键可以将两张表关联起来,形成多对一的关系,多
是指学生信息表中的多行(即多个学生),一
是指学院信息表中的一行(即一个学院)。
先给agent
表的sellerid
列添加一个外键指向seller
表的sellerid
列:
alter table agent add constraint sellerid foreign key(sellerid) references seller(sellerid);
下面试试插入一些数据,可以看到如果seller
表为空的话,是没办法在agent表中新增一行带有sellerid的记录的,必须seller
表中存在这个sellerid才可以新增记录成功。不过注意到agent
表中的sellerid
列是允许为NULL的,那么随意新增一个不带sellerid
的记录也是允许。
mysql> insert into agent(agentid, sellerid) values(2, 3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`user`.`agent`, CONSTRAINT `sellerid` FOREIGN KEY (`sellerid`) REFERENCES `seller` (`sellerid`))
mysql>
mysql> insert into seller(sellerid) values(3);
Query OK, 1 row affected (0.04 sec)
mysql> insert into agent(agentid, sellerid) values(2, 3);
Query OK, 1 row affected (0.12 sec)