回 帖 发 新 帖 刷新版面

主题:请教关于MYSQL的外键约束

大家好,本人使用MYSQL建了两张表:country、city,如下:
create table country
(countryId int auto_increment primary key,
countryName varchar(20) not null)type=innoDB;

create table city
(cityId int auto_increment primary key,
cityName varchar(20) not null,
countryName varchar(20) not null references country(countryName) RESTRICT)type=innoDB;

insert into country (countryName) values ('China');
insert into country (countryName) values ('USA');
insert into country (countryName) values ('England');

insert into city (cityName,countryName) values ('NanChang','ABCD');
请问为什么没能阻止最后一行代码的执行?
官方网站[color=008080]http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html[/color]看完也没有相关解释,挺郁闷,求教,谢谢!

回复列表 (共4个回复)

沙发

你写的可以执行吗,我执行时为什么会出错啊?
服务器: 消息 170,级别 15,状态 1,行 4
第 4 行: 'auto_increment' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 9
第 9 行: 'auto_increment' 附近有语法错误。

还有为什么要阻止最后一行代码执行呢?  你的意思是不是说,主键没有'ABCD'的值,所以外键不能添加'ABCD',应该执行时出错,对吗?

板凳

还有 countryName varchar(20) not null references country(countryName)
根本没有引用到表country中的主键,因为你在表country中建立的主键是 countryId int auto_increment primary key,即使你执行成功的话,最后一句当然会执行的,因为 city表中的countryName 引用的根本不是表country中的countryName 主键,我不知道说的对不对,我也是初学者!

3 楼

从表中建外键并不要求一定是主表中的主键.

4 楼

参照完整性(Referential integrity)是数据库设计中一个重要的概念。在系统不同的列表中,当数据库所有参照合法或非合法关联时都会涉及到参照完整性。当参照完整性存在时,任何与不存在记录的关联将变得无效化,由此可防止用户出现各种错误,从而提供更为准确和实用的数据库。

参照完整性通常通过外键(foreign key)的使用而被广泛应用。长久以来,流行工具开源RDBMS MySQL并没有支持外键,原因是这种支持将会降低RDBMS的速度和性能。然而,由于很多用户对参照完整性的优点倍感兴趣,最近MySQL的不同版本都通过新InnoDB列表引擎支持外键。由此,在数据库组成的列表中保持参照完整性将变得非常简单。

为了建立两个MySQL表之间的一个外键关系,必须满足以下三种情况:

两个表必须是InnoDB表类型。 
使用在外键关系的域必须为索引型(Index)。 
使用在外键关系的域必须与数据类型相似。

我来回复

您尚未登录,请登录后再回复。点此登录或注册