Can';t在MySQL(DDL)中使用外键创建表
通常我使用PostgreSQL,从来没有遇到过问题,但现在我需要使用MySQL,我遇到了一些麻烦。 我正在数据库user_main_db中创建一个表。外键有问题,phpMyAdmin总是给我下一个错误: 1005-无法创建表“user\u main\u db.user\u main”(错误号:150)( engine=InnoDB&page=Status&token=136fdbb820093986c79180b24adb304d“>详细信息…) 这是我试图在数据库用户\u main\u db中创建的表:Can';t在MySQL(DDL)中使用外键创建表,mysql,foreign-keys,ddl,Mysql,Foreign Keys,Ddl,通常我使用PostgreSQL,从来没有遇到过问题,但现在我需要使用MySQL,我遇到了一些麻烦。 我正在数据库user_main_db中创建一个表。外键有问题,phpMyAdmin总是给我下一个错误: 1005-无法创建表“user\u main\u db.user\u main”(错误号:150)( engine=InnoDB&page=Status&token=136fdbb820093986c79180b24adb304d“>详细信息…) 这是我试图在数据库用户\u main\u 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
);
这是数据库用户\u basic\u数据库中的表用户\u basic:
CREATE TABLE user_basic
(
uid INTEGER AUTO_INCREMENT,
email VARCHAR(40) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (uid)
);
这是数据库国家/地区\数据库中的国家/地区表:
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
);
查询已成功运行,但未创建外键。当我打开“关系视图”时,没有对uid和country_id的引用,即使没有具有此类id的国家,我也可以插入用户_main(country_id)。
请帮助他人。谢谢。MySQL有存储引擎的概念,它提供不同的功能和性能配置文件。我怀疑您是用MyISAM存储引擎创建表的,它不提供外键 如果您使用INNODB引擎,我怀疑您的外键将按预期工作 编辑
通过在
CREATE TABLE
语句的结束括号后提供engine=InnoDB
子句来设置存储引擎查看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;
这应该可以完成任务。您的上一个问题(奇怪的外键)这对我来说并不奇怪,我不知道原因,但mysql在使用您提到的语法时不会在列中附加外键。谢谢您的帮助!我会记住它。它对我来说非常有用。您的mysql服务器上启用了InnoDB吗?您真的在执行这三个查询之前删除了所有表吗?是的,我确实删除了。但是什么你的意思是启用InnoDB吗?我在iMac上使用MAMP。默认情况下,一切都是这样。尝试
显示变量,如“have_InnoDB”;
-如果返回是,则InnoDB被启用。你使用的是哪个版本的MySQL?查询返回是。版本I suppos是MySQL 5.5.Hm。慢慢地,我开始失去想法。尝试添加约束在语句中指定(请参阅我更新的SQL以创建表user\u main
,如果我们强制您的数据库使用特定名称,请查看此操作是否有效。