我有以下SQL脚本。运行后,永远不会强制执行外键关系。
CREATE TABLE Country (
name varchar(40) NOT NULL,
abbreviation varchar(4) NOT NULL,
PRIMARY KEY (name)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE StateProvince (
countryName varchar(40) NOT NULL,
name varchar(100) NOT NULL,
abbreviation varchar(3) NOT NULL,
PRIMARY KEY (countryName,name)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
alter table StateProvince
add index FK_StateProvince_Country (countryName),
add constraint FK_StateProvince_Country
foreign key (countryName)
references Country (name);
这是因为复合主键吗?
答案 0 :(得分:1)
根据MySQL docs on foreign keys,MyISAM表引擎不支持外键。相反,它默默地忽略了它们。请改用InnoDB。试试这个:
CREATE TABLE Country (
name varchar(40) NOT NULL,
abbreviation varchar(4) NOT NULL,
PRIMARY KEY (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE StateProvince (
countryName varchar(40) NOT NULL,
name varchar(100) NOT NULL,
abbreviation varchar(3) NOT NULL,
PRIMARY KEY (countryName,name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
alter table StateProvince
add index FK_StateProvince_Country (countryName),
add constraint FK_StateProvince_Country
foreign key (countryName)
references Country (name);
答案 1 :(得分:1)
只有InnoDB引擎支持foreign keys:
InnoDB支持外键约束。
答案 2 :(得分:0)
根据本文
,它与此无关http://dev.mysql.com/doc/refman/5.0/en/example-foreign-keys.html
外键约束不是 仅需加入两张桌子。 对于InnoDB以外的存储引擎 定义列时可以 使用REFERENCES tbl_name(col_name) 条款,没有实际效果, 并仅作为备忘录或评论 对你说你是哪一列 目前定义的目的是 引用另一个表中的列。它 意识到什么时候非常重要 使用以下语法:
答案 3 :(得分:0)
@Benju。
您必须使用InnoDB替换MyISAM,然后您可以将主键用作复合或单个。它有效,我已经测试过了。