当前位置: 首页 > 知识库问答 >
问题:

MySQL创建数据库:FK的问题

闻人举
2023-03-14

这里是脚本的一小部分(即脚本的第一行):当我尝试执行它时,告诉我:
错误代码:1005。无法创建表“test.paese”(错误号:150)0.062秒

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

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

CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `test` ;

-- -----------------------------------------------------
-- Table `test`.`SETTORE`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `test`.`SETTORE` (
  `Comune` CHAR NOT NULL ,
  `superficie` INT(11) NULL ,
  PRIMARY KEY (`Comune`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test`.`PAESE`
-- -----------------------------------------------------
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)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test`.`PERIODO`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `test`.`PERIODO` (
  `Settimana` INT(11) NOT NULL ,
  PRIMARY KEY (`Settimana`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test`.`TIPO-INIZIATIVA`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `test`.`TIPO-INIZIATIVA` (
  `Nome-tipo-iniziativa` CHAR NOT NULL ,
  PRIMARY KEY (`Nome-tipo-iniziativa`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test`.`INIZIATIVA`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `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` TIME NULL ,
  `orario_chiusura` TIME NULL ,
  PRIMARY KEY (`Nome-tipo-iniziativa`, `Settimana`, `Nome-paese`, `Comune`) ,
  INDEX `Nome-paese` (`Nome-paese` ASC) ,
  INDEX `Comune` (`Comune` ASC) ,
  INDEX `Settimana` (`Settimana` ASC) ,
  INDEX `Nome-tipo-iniziativa` (`Nome-tipo-iniziativa` ASC) ,
  CONSTRAINT `Nome-paese`
    FOREIGN KEY (`Nome-paese` )
    REFERENCES `test`.`PAESE` (`Nome-paese` )
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `Comune`
    FOREIGN KEY (`Comune` )
    REFERENCES `test`.`PAESE` (`Comune` )
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `Settimana`
    FOREIGN KEY (`Settimana` )
    REFERENCES `test`.`PERIODO` (`Settimana` )
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `Nome-tipo-iniziativa`
    FOREIGN KEY (`Nome-tipo-iniziativa` )
    REFERENCES `test`.`TIPO-INIZIATIVA` (`Nome-tipo-iniziativa` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;`

因此DBMS首先创建表SETTORE,但在执行create table PAESE时,它会停止。我找不到这几行中的错误,请帮帮我,我太需要了!!

共有2个答案

戚阳文
2023-03-14

由于您的引用选项,约束失败。

... 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)
澹台展鹏
2023-03-14

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

test中的列comune不可为空。paese。你在让MySQL旋转!

显示引擎INNODB状态;

------------------------
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.
------------
 类似资料:
  • 在MySQL 中,可以使用 CREATE DATABASE 语句创建数据库,语法格式如下: 中的内容是可选的。语法说明如下: <数据库名>:创建数据库的名称。MySQL 的数据存储区将以目录方式表示 MySQL 数据库,因此数据库名称必须符合操作系统的文件夹命名规则,不能以数字开头,尽量要有实际意义。注意在 MySQL 中不区分大小写。 IF NOT EXISTS:在创建数据库之前进行判断,只有该

  • 主要内容:使用 MySQLi 和 PDO 创建 MySQL 数据库,实例 (MySQLi - 面向对象),实例 (MySQLi Procedural),实例数据库存有一个或多个表。 你需要 CREATE 权限来创建或删除 MySQL 数据库。 使用 MySQLi 和 PDO 创建 MySQL 数据库 CREATE DATABASE 语句用于在 MySQL 中创建数据库。 在下面的实例中,创建了一个名为 "myDB" 的数据库: 实例 (MySQLi - 面向对象) <?php $serverna

  • 前面章节介绍了如何登陆连接 MySQL 数据库,连接 MySQL 数据库之后就可以对数据库进行操作了,本小节将介绍如何创建一个属于自己项目的数据库。 1.使用命令行新建一个数据库 1.1 进入 MySQL 首先登陆进入 MySQL 操作界面,命令如下: 命令 : mysql -utest -p; 1.2 查看数据库 登陆成功之后可以使用如下命令查看当前已有数据库: 命令 : SHOW DAT

  • 问题内容: 是否可以从Java创建MySQL数据库? 我只看过这样的连接URL示例,其中在URL中指定了数据库名称: 当我只有登录名和密码时,如何创建MySQL数据库? 问题答案: jdbc连接中不需要数据库,因此您可以执行以下建议的操作:http://forums.mysql.com/read.php?39,99321,102211#msg-102211和http://marc.info /?l

  • MySQL 是一个使用广泛的数据库服务器,你肯定会在某些节点上安装配置 MySQL 服务器。 本节将向你展示如何安装配置 MySQL 服务器,以及如何为应用程序自动创建数据库和用户。 准备工作 如果你还没有 MySQL 模块,先创建一个: # mkdir /etc/puppet/modules/mysql # mkdir /etc/puppet/modules/manifests # mkdir

  • 问题内容: 您能帮忙解决这个问题吗? 我正在尝试创建然后使用一个名为TIGER的数据库。 如果我在MySQL中创建数据库并且运行完美,我没有问题。 我想做的是从Java创建它。这样,当首次运行代码时,它将在初始启动过程中创建数据库。如果可能的话,我想用一种干净的方法将其装箱。 有人可以告诉我您实际将代码放置在哪里 这是代码 这是创建数据库的代码 在此先感谢,感谢您的帮助。 因为我是一个长期读者但还