首页 » PHP和MySQL Web开发(原书第4版) » PHP和MySQL Web开发(原书第4版)全文在线阅读

《PHP和MySQL Web开发(原书第4版)》13.4 外键

关灯直达底部

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