1

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

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

engine=InnoDB&page=Status&token=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)。请帮助某人。谢谢你。

4

2 回答 2

2

查看有关外键约束的 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;

这应该可以完成这项工作。

于 2012-06-12T12:01:42.373 回答
0

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

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

编辑

您可以通过在语句的右括号提供ENGINE=InnoDB子句来设置存储引擎CREATE TABLE

于 2012-06-12T11:51:07.027 回答