无法创建 MySql 表

Posted

技术标签:

【中文标题】无法创建 MySql 表【英文标题】:cant create a MySql table 【发布时间】:2016-03-24 21:00:18 【问题描述】:

我已经创建了这个表

CREATE TABLE `Overview` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ops` varchar(11) NOT NULL,
  `date` date NOT NULL,
  `title` text,
  `beneficiary_Institution` varchar(100) DEFAULT NULL,
  `description` longtext,
  `public_Expenditure_Budget` decimal(14,2) DEFAULT NULL,
  `payments` decimal(14,2) DEFAULT NULL,
  `completition_percent` int(11) DEFAULT NULL,
  `start` varchar(11) DEFAULT NULL,
  `finish` varchar(11) DEFAULT NULL,
  `sub_projects` int(11) DEFAULT NULL,
  `public_aid` decimal(14,2) DEFAULT NULL,
  `operational_programme_number` int(11) DEFAULT NULL,
  `operational_programme` varchar(100) DEFAULT NULL,
  `title_ops` text,
  `map_coordinates` varchar(15000) DEFAULT NULL,
  PRIMARY KEY (`id`,`ops`,`date`)
)ENGINE=InnoDB;

我尝试创建一个具有外键的表

CREATE TABLE `Proposal_Body` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `ops` VARCHAR(11) NULL,
  `title` VARCHAR(100) NULL,
  `representative` VARCHAR(45) NULL,
  `address` VARCHAR(45) NULL,
  `email` VARCHAR(45) NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_Proposal_Body_1_idx` (`ops` ASC),
  CONSTRAINT `fk_Proposal_Body_1`
    FOREIGN KEY (`ops`)
    REFERENCES `espanew`.`Overview` (`ops`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
)ENGINE=InnoDB;

这个和我尝试的任何其他尝试都会给我这个错误

ERROR 1005 (HY000): 无法创建表 'Espa_Projects_Eng.Proposal_Body'(错误号:150)

我知道这是一个外键问题,但我看不出原因。这段代码来自 mysql 客户端,我使用 ui 进行创建,没有手动输入命令,所以它应该可以工作。

非常感谢

【问题讨论】:

见***.com/questions/825362/mysql-error-150-foreign-keys 您是否检查过您的第一个表,即“概览”是否存在于 DB 中? 您可以参考给定的积分here。这可能会对您有所帮助。 我非常确定我可以有一个外键指向一个组合键的 PK!在我的机器上使用相同的mysql,它确实在一段时间前工作了。不知道从那以后我是否改变了一些东西,但现在看来它不允许我进行这样的连接 【参考方案1】:

阅读文档:

如果你重新创建一个被删除的表,它必须有一个定义 符合引用它的外键约束。它必须 具有正确的列名和类型,并且必须有索引 引用的键,如前所述。如果这些都不满足, MySQL 返回 Error 1005 并在错误消息中引用 Error 150, 这意味着没有正确形成外键约束。 同样,如果 ALTER TABLE 由于错误 150 而失败,这意味着 更改后的外键定义将被错误地形成 表。

如您所见,您的第一个表具有以下主键:

PRIMARY KEY (`id`,`ops`,`date`)

但在第二个表中,外键是:

FOREIGN KEY (`ops`)

您必须更正此问题才能使其正常工作。

【讨论】:

你是在暗示我不能有一个外键指向裁判表的 PK 之一吗?我以前从未听说过 @SkarosIlias 当然,因为在您的主键中涉及多个字段,因此外键必须匹配。【参考方案2】:

你的主键是一个复合键

主键 (id,ops,date)

你的外键只包含一列,即

外键 (ops)

外键必须与它们引用列的主键/唯一键相匹配。要消除此错误,您需要将 iddate 添加到 Proposal_Body 表中,或者您的第一个表 Overview 主键错误,应该只是 (@987654327 @)。

【讨论】:

以上是关于无法创建 MySql 表的主要内容,如果未能解决你的问题,请参考以下文章

Mysql:无法创建表 errno 150

MySQL:无法创建表(错误号:150)

MySQL:无法创建表(错误号:150)

MySQL:无法创建表(错误号:150)

MySQL:无法创建表(错误号:150)

MySQL:无法创建表(错误号:150)