无法在MySQL(DDL)中使用FOREIGN KEY创建表

时间:2012-06-12 11:45:45

标签: mysql foreign-keys ddl

通常我使用PostgreSQL并且从未遇到过问题,但现在我需要使用MySQL并遇到一些麻烦。 我在数据库user_main_db中创建一个表。外键有一些问题,phpMyAdmin总是给我下一个错误:

  1005 - 无法创建表'user_main_db.user_main'(错误号:150)(      

发动机= InnoDB的&安培;页=状态&安培;标记= 136fdbb820093986c79180b24adb304d“>详细...)

这是我试图在数据库user_main_db中创建的表:

CREATE TABLE user_main
(
uid INTEGER,
fn VARCHAR(40) NOT NULL,
ava VARCHAR(255),
gender tinyint(1) NOT NULL,
dob DATE NOT NULL,
country_id INTEGER, 
PRIMARY KEY (uid),
FOREIGN KEY ( uid ) REFERENCES user_basic_db.user_basic(uid) ON DELETE CASCADE ON UPDATE            CASCADE,
FOREIGN KEY ( country_id ) REFERENCES countries_db.countries(country_id) ON DELETE CASCADE   ON UPDATE CASCADE
);

这是数据库user_basic_db中的表user_basic:

CREATE TABLE user_basic
(
uid INTEGER AUTO_INCREMENT,
email VARCHAR(40) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (uid)
);

这是数据库countries_db中的表国家/地区:

 CREATE TABLE countries(
    country_id INTEGER PRIMARY KEY AUTO_INCREMENT,
    country VARCHAR(40) NOT NULL UNIQUE
    )

奇怪的是,当我按如下方式定义表时:

CREATE TABLE user_main
(
uid INTEGER PRIMARY KEY REFERENCES user_basic_db.user_basic(uid)  ON DELETE CASCADE ON    UPDATE CASCADE,
 VARCHAR(40) NOT NULL,
ava VARCHAR(255),
gender tinyint(1) NOT NULL,
dob DATE NOT NULL,
country_id INTEGER REFERENCES countries_db.countries(country_id) ON DELETE CASCADE ON  UPDATE CASCADE
);

查询成功运行但是没有创建FOREIGN KEYS,当我打开'关系视图'时,没有对uid和country_id的引用,即使没有具有此类id的国家/地区,我也可以插入到user_main(country_id)。 请帮助别人。谢谢。

2 个答案:

答案 0 :(得分:2)

查看关于foreign key constrains的MySQL手册:

  

如果重新创建已删除的表,则必须具有定义   符合引用它的外键约束。它必须   拥有正确的列名和类型,并且必须具有索引   如前所述,引用的密钥。如果不满意,MySQL   返回错误号1005并在错误中引用错误150   消息。

听起来很熟悉,不是吗??

最好删除表并使用格式良好的语法创建新表,如下所示:

CREATE TABLE `countries` (
  `country_id` int(11) NOT NULL AUTO_INCREMENT,
  `country` varchar(40) NOT NULL,
  PRIMARY KEY (`country_id`),
  UNIQUE KEY `country` (`country`)
) ENGINE=InnoDB;

CREATE TABLE `user_basic` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(40) NOT NULL,
  `password` varchar(40) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB;

CREATE TABLE `user_main` (
  `uid` int(11) NOT NULL,
  `fn` varchar(40) NOT NULL,
  `ava` varchar(255) DEFAULT NULL,
  `gender` tinyint(1) NOT NULL,
  `dob` date NOT NULL,
  `country_id` int(11) NOT NULL,
  PRIMARY KEY (`uid`),
  KEY `user_main_ibfk_2` (`country_id`),
  CONSTRAINT testc1
  FOREIGN KEY (`country_id`) REFERENCES `countries` (`country_id`) 
    ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT testc2
  FOREIGN KEY (`uid`) REFERENCES `user_basic` (`uid`) 
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

这应该可以胜任。

答案 1 :(得分:0)

MySQL具有storage engines的概念,它提供不同的功能和性能配置文件。我怀疑你用MyISAM存储引擎创建了你的表,它不提供外键。

如果您使用INNODB引擎,我怀疑您的外键将按预期工作。

修改

您可以通过在ENGINE=InnoDB声明的结束括号之后提供CREATE TABLE子句来设置存储引擎