Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
MySQL使用外键创建表,错误号:150_Mysql_Foreign Keys_Mysql Error 150 - Fatal编程技术网

MySQL使用外键创建表,错误号:150

MySQL使用外键创建表,错误号:150,mysql,foreign-keys,mysql-error-150,Mysql,Foreign Keys,Mysql Error 150,我试图在MySQL中创建一个包含两个外键的表,它们引用了另外两个表中的主键,但是我得到一个errno:150错误,它不会创建该表 以下是所有3个表的SQL: CREATE TABLE role_groups ( `role_group_id` int(11) NOT NULL `AUTO_INCREMENT`, `name` varchar(20), `description` varchar(200), PRIMARY KEY (`role_group_id`) ) ENGIN

我试图在MySQL中创建一个包含两个外键的表,它们引用了另外两个表中的主键,但是我得到一个errno:150错误,它不会创建该表

以下是所有3个表的SQL:

CREATE TABLE role_groups (
  `role_group_id` int(11) NOT NULL `AUTO_INCREMENT`,
  `name` varchar(20),
  `description` varchar(200),
  PRIMARY KEY (`role_group_id`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `roles` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50),
  `description` varchar(200),
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB;

create table role_map (
  `role_map_id` int not null `auto_increment`,
  `role_id` int not null,
  `role_group_id` int not null,
  primary key(`role_map_id`),
  foreign key(`role_id`) references roles(`role_id`),
  foreign key(`role_group_id`) references role_groups(`role_group_id`)
) engine=InnoDB;

非常感谢您的帮助。

运行此脚本时,数据库的当前状态是什么?它完全是空的吗?当我从头开始创建数据库时,您的SQL运行良好,但errno 150通常与删除和重新创建作为外键一部分的表有关。我感觉你不是在用一个100%全新的数据库工作

如果在“source”命令调用SQL文件时出错,那么应该能够在“source”命令之后立即从MySQL提示符运行命令“SHOW ENGINE INNODB STATUS”,以查看更详细的错误信息

您可能还想查看手动输入:

如果重新创建已删除的表,则该表的定义必须符合引用该表的外键约束。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果不满足这些条件,MySQL将返回错误号1005,并在错误消息中引用错误150。如果MySQL报告CREATETABLE语句中的错误号1005,并且错误消息指向错误150,则表创建失败,因为外键约束的格式不正确

-


运行此脚本时,数据库的当前状态是什么?它完全是空的吗?当我从头开始创建数据库时,您的SQL运行良好,但errno 150通常与删除和重新创建作为外键一部分的表有关。我感觉你不是在用一个100%全新的数据库工作

如果在“source”命令调用SQL文件时出错,那么应该能够在“source”命令之后立即从MySQL提示符运行命令“SHOW ENGINE INNODB STATUS”,以查看更详细的错误信息

您可能还想查看手动输入:

如果重新创建已删除的表,则该表的定义必须符合引用该表的外键约束。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果不满足这些条件,MySQL将返回错误号1005,并在错误消息中引用错误150。如果MySQL报告CREATETABLE语句中的错误号1005,并且错误消息指向错误150,则表创建失败,因为外键约束的格式不正确

-


确保尝试与约束链接的两个字段的属性完全相同

通常,ID列上的“unsigned”属性会让您感到困惑

ALTER TABLE `dbname`.`tablename` CHANGE `fieldname` `fieldname` int(10) UNSIGNED NULL;

确保尝试与约束链接的两个字段的属性完全相同

通常,ID列上的“unsigned”属性会让您感到困惑

ALTER TABLE `dbname`.`tablename` CHANGE `fieldname` `fieldname` int(10) UNSIGNED NULL;

我在
altertable ADD外键时也遇到了同样的问题

一个小时后,我发现必须满足以下条件才能获得错误150:

  • 父表必须存在,然后才能定义引用它的外键。必须按照正确的顺序定义表:首先定义父表,然后定义子表。如果两个表相互引用,则必须创建一个不带FK约束的表,然后创建第二个表,然后使用
    ALTER table
    将FK约束添加到第一个表中

  • 这两个表都必须支持外键约束,即
    ENGINE=InnoDB
    。其他存储引擎会自动忽略外键定义,因此不会返回错误或警告,但不会保存FK约束

  • 父表中引用的列必须是键的最左边的列。如果父项中的键是
    主键
    唯一键
    ,则最佳

  • FK定义必须以与PK定义相同的顺序引用PK列。例如,如果FK
    引用父项(a、b、c)
    ,则父项的PK不能按
    (a、c、b)
    的顺序在列上定义

  • 父表中的PK列必须与子表中的FK列具有相同的数据类型。例如,如果父表中的PK列是
    无符号的
    ,请确保在子表字段中为相应列定义
    无符号的

    例外:字符串的长度可能不同。例如,
    VARCHAR(10)
    可以引用
    VARCHAR(20)
    ,反之亦然

  • 任何字符串类型的FK列必须与相应的PK列具有相同的字符集和排序规则

  • 如果子表中已有数据,则FK列中的每个值都必须与父表PK列中的值匹配。使用如下查询检查此项:

    SELECT COUNT(*) FROM Child LEFT OUTER JOIN Parent ON Child.FK = Parent.PK 
    WHERE Parent.PK IS NULL;
    
    这必须返回零(0)个不匹配的值。显然,这个查询是一个通用的例子;必须替换表名和列名

  • 父表和子表都不能是
    临时表

  • 父表和子表都不能是分区的
  • 如果使用“删除时设置为空”选项声明FK,则FK列必须可以为空

  • 如果为外键声明约束名称,则约束名称在整个架构中必须是唯一的,而不仅仅是在定义约束的表中。两个表可能没有自己的同名约束

  • 如果其他表中有任何其他FK指向您试图为其创建新FK的同一字段,并且它们的格式不正确(即不同的排序规则),则需要将它们设置为一致
    CREATE TABLE user (
      userId int PRIMARY KEY AUTO_INCREMENT,
      username varchar(30) NOT NULL
    ) ENGINE=InnoDB;
    
    CREATE TABLE product (
      id int PRIMARY KEY AUTO_INCREMENT,
      userId int,
      FOREIGN KEY fkProductUser1(userId) REFERENCES **u**ser(userId)
    ) ENGINE=InnoDB;
    
    CREATE TABLE product (
      id int PRIMARY KEY AUTO_INCREMENT,
      userId int,
      FOREIGN KEY fkProductUser1(userId) REFERENCES User(userId)
    ) ENGINE=InnoDB;
    
    CREATE TABLE users(
       id INT AUTO_INCREMENT PRIMARY KEY,
       username VARCHAR(40));
    
    CREATE TABLE userroles(
       id INT AUTO_INCREMENT PRIMARY KEY,
       user_id INT NOT NULL,
       FOREIGN KEY(user_id) REFERENCES users(id));
    
    SET FOREIGN_KEY_CHECKS = 1;