1

这是脚本的一小部分(即该脚本的第一行):当我尝试执行它时说我:
错误代码:1005。无法创建表'test.paese'(errno:150)0.062秒

当我尝试从 MySQL 执行“Forward Engineer”时,它回复了我一些问题:
如果 MySQL 从 CREATE TABLE 语句中报告错误号 1005,并且错误消息是指错误 150,则表创建失败,因为外键约束是没有正确形成。

`SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
设置@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

如果不存在 `test` 则创建 SCHEMA 默认字符集 latin1 COLLATE latin1_swedish_ci ;
使用`测试`;

-------------------------------------------------- -----
-- 表`test`.`SETTORE`
-------------------------------------------------- -----
如果不存在 `test`.`SETTORE` (
  `Comune` CHAR NOT NULL ,
  `superficie` INT(11) NULL ,
  主键(`Comune`))
引擎 = InnoDB;


-------------------------------------------------- -----
-- 表`test`.`PAESE`
-------------------------------------------------- -----
如果不存在 `test`.`PAESE` (
  `Nome-paese` CHAR NOT NULL ,
  `Comune` CHAR NOT NULL ,
  `num_abitanti` INT(11) NULL ,
  `altitudine` INT(11) NULL ,
  `IDpaese` INT(11) NOT NULL ,
  PRIMARY KEY (`Nome-paese`, `Comune`) ,
  索引 `Comune` (`Comune` ASC) ,
  唯一索引 `idPAESE_UNIQUE` (`IDpaese` ASC) ,
  约束`公社`
    外键(`Comune`)
    参考 `test`.`SETTORE` (`Comune`)
    删除设置为空
    更新级联)
引擎 = InnoDB;


-------------------------------------------------- -----
-- 表`test`.`PERIODO`
-------------------------------------------------- -----
如果不存在则创建表`test`.`PERIODO`(
  `Settimana` INT(11) NOT NULL ,
  主键(`Settimana`))
引擎 = InnoDB;


-------------------------------------------------- -----
-- 表 `test`.`TIPO-INIZIATIVA`
-------------------------------------------------- -----
如果不存在 `test`.`TIPO-INIZIATIVA`,则创建表(
  `Nome-tipo-iniziativa` CHAR NOT NULL ,
  主键 (`Nome-tipo-iniziativa`) )
引擎 = InnoDB;


-------------------------------------------------- -----
-- 表`test`.`INIZIATIVA`
-------------------------------------------------- -----
如果不存在 `test`.`INIZIATIVA`,则创建表(
  `Nome-tipo-iniziativa` CHAR NOT NULL ,
  `Settimana` INT(11) NOT NULL ,
  `Nome-paese` CHAR NOT NULL ,
  `Comune` CHAR NOT NULL ,
  `descrizione` VARCHAR(45) ,
  `costo_intero` FLOAT NULL ,
  `costo_ridotto` FLOAT NULL ,
  `orario_apertura` 时间 NULL ,
  `orario_chiusura` 时间 NULL ,
  主键(`Nome-tipo-iniziativa`,`Settimana`,`Nome-paese`,`Comune`),
  INDEX `Nome-paese` (`Nome-paese` ASC) ,
  索引 `Comune` (`Comune` ASC) ,
  索引`Settimana` (`Settimana` ASC) ,
  索引 `Nome-tipo-iniziativa` (`Nome-tipo-iniziativa` ASC) ,
  约束`Nome-paese`
    外键(`Nome-paese`)
    参考 `test`.`PAESE` (`Nome-paese` )
    删除设置为空
    在更新级联时,
  约束`公社`
    外键(`Comune`)
    参考 `test`.`PAESE` (`Comune`)
    删除设置为空
    在更新级联时,
  约束`Settimana`
    外键(`Settimana`)
    参考 `test`.`PERIODO` (`Settimana` )
    删除设置为空
    在更新级联时,
  约束`Nome-tipo-iniziativa`
    外键(`Nome-tipo-iniziativa`)
    参考 `test`.`TIPO-INIZIATIVA` (`Nome-tipo-iniziativa` )
    删除设置为空
    更新级联)
引擎= InnoDB;`

因此,DBMS 首先创建表SETTORE,然后在执行CREATE TABLE PAESE时停止。我在这些行中找不到错误,请帮助我,我非常需要它!

4

2 回答 2

3

由于您的参考选项,约束失败。

... ON DELETE SET NULL

这是非法的,因为您的列不能是NULL.

CREATE  TABLE IF NOT EXISTS `test`.`PAESE` (
  `Nome-paese` CHAR NOT NULL ,
  `Comune` CHAR NOT NULL ,  <----------------------------+
  `num_abitanti` INT(11) NULL ,                          |
  `altitudine` INT(11) NULL ,                            |
  `IDpaese` INT(11) NOT NULL ,                           |
  PRIMARY KEY (`Nome-paese`, `Comune`) ,                 |
  INDEX `Comune` (`Comune` ASC) ,                        |
  UNIQUE INDEX `idPAESE_UNIQUE` (`IDpaese` ASC) ,        |
  CONSTRAINT `Comune`                                    |
    FOREIGN KEY (`Comune` )                              |
    REFERENCES `test`.`SETTORE` (`Comune` )              |
    ON DELETE SET NULL  <--------------------------------+
    ON UPDATE CASCADE)
于 2013-01-29T16:26:45.627 回答
2

这是因为列上的约束冲突Comune

Comune在 中不可为空testPAESE. 你正在让 MySQL 旋转!

SHOW ENGINE INNODB STATUS;

------------------------
LATEST FOREIGN KEY ERROR
------------------------
130129 21:55:19 Error in foreign key constraint of table test/paese:
FOREIGN KEY (`Comune`)
        REFERENCES `test`.`SETTORE` (`Comune`)
        ON DELETE SET NULL ON UPDATE CASCADE
):
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.
------------
于 2013-01-29T16:27:04.223 回答