通常我使用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)。 请帮助别人。谢谢。
答案 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
子句来设置存储引擎