Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在MySQL(DDL)中使用外键创建表_Mysql_Foreign Keys_Ddl - Fatal编程技术网

Can';t在MySQL(DDL)中使用外键创建表

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中

通常我使用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
,如果我们强制您的数据库使用特定名称,请查看此操作是否有效。