InnoDB也支持外键。回忆一下,在第8章中,我们已经介绍了外键的概念。当使用MyISAM表格时,无法强制使用外键。
例如,假设在order_items表格中插入一行。必须包括一个有效的orderid。使用MyISAM表格,必须确认插入到程序逻辑任何位置的orderid具有有效性。在InnoDB中使用外键,可以让数据库完成检查操作。
如何设置外键呢?要创建一个使用外键的表格,可以改变该表格的DDL(数据定义语言)语句,如下所示:
create table order_items(
orderid int unsigned not null references orders(orderid),
isbn char(13)not null,
quantity tinyint unsigned,
primary key(orderid,isbn)
)type=InnoDB;
我们在orderid后添加了references orders(orderid)。这就意味着该列是一个外键,必须包含orders表格中的orderid列值。
最后,我们在声明的末尾添加了type=InnoDB的表格类型。这是外键所要求的。
使用ALTER TABLE语句,也可以对已有的表格进行以上修改,如下所示:
alter table order_items type=InnoDB;
alter table order_items
add foreign key(orderid)references orders(orderid);
要了解以上修改的工作原理,可以尝试插入一个数据行,而在orders表中,并没有与该行orderid相匹配的行:
insert into order_items values(77,'0-672-31697-8',7);
将看到类似如下所示的错误:
ERROR 1452(23000):Cannot add or update a child row:
a foreign key constraint fails