Laravel迁移150错误

时间:2015-03-05 09:36:22

标签: php laravel

我的迁移文件出错。但是我无法找到任何错误解决方案。当我运行迁移命令时,我在以下系统上出现错误。

[Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1005 Can't create table 'zadmin_elder.PowerCuts' (errno: 150) (SQL: create table `PowerCuts` (`CutID`
   int unsigned not null auto_increment primary key, `Title` varchar(45) null, `Message` varchar(250) null, `CreatedAt` datetime not nu
  ll, `UpdatedAt` datetime null, `DeletedAt` datetime null, `PlannedDate` date null, `StartTime` time null, `EndTime` time null, `TownI
  D` int unsigned not null, `Distrcit` varchar(45) null, `Geolocation` varchar(45) not null, `GeoRadius` int unsigned not null) default
   character set utf8 collate utf8_unicode_ci)
[PDOException]
  SQLSTATE[HY000]: General error: 1005 Can't create table 'zadmin_elder.PowerCuts' (errno: 150)

这是我的create_powercut_table.php的创建功能;

Schema::create('PowerCuts', function(Blueprint $table)
        {
            $table->increments('CutID', true)->unsigned();
            $table->string('Title', 45)->nullable();
            $table->string('Message', 250)->nullable();
            $table->dateTime('CreatedAt');
            $table->dateTime('UpdatedAt')->nullable();
            $table->dateTime('DeletedAt')->nullable();
            $table->date('PlannedDate')->nullable();
            $table->time('StartTime')->nullable();
            $table->time('EndTime')->nullable();
            $table->integer('TownID')->unsigned()->index('fk_PowerCuts_Towns1_idx');
            $table->string('Distrcit', 45)->nullable();
            $table->string('Geolocation', 45);
            $table->integer('GeoRadius')->unsigned();
        });

这是我的create_Foreign_powercut.php的创建功能;

Schema::table('PowerCuts', function(Blueprint $table){
            $table->foreign('TownID', 'PowerCuts_ibfk_1')->references('TownID')->on('Towns')->onUpdate('CASCADE')->onDelete('CASCADE');
        });

谢谢,问候

修改 我找到了150错误的解决方案。在information_scheme中没有删除constrait指向同名的迁移表名。这就是我收到该错误的原因。

另外,我已经学会了100个对150错误的引用,这通常源于数据类型不匹配。您必须检查完全匹配的外键和主键类型。

2 个答案:

答案 0 :(得分:1)

根据MySQL InnoDB Error Codes

  

如果错误消息引用错误150,则表创建失败,因为未正确形成外键约束。

检查PowerCuts.TownIDTowns.TownID是否完全相同(无符号整数),因为外键字段的类型必须与引用列的类型相同。

答案 1 :(得分:1)

免责声明: 我知道这已经得到了解答,但我会留下这个答案,以便日后咨询任何有问题的人。

  SQLSTATE[HY000]: General error: 1005 Can't create table 'zadmin_elder.PowerCuts' (errno: 150) 

这个错误通常意味着,在另一个表上引用的外键存在问题,主要是因为不兼容的原因,例如在字符串行上引用整数,等等。

<强> 或者,

就像我的情况一样,引用了一开始就不存在的东西。

让我解释一下:

您来创建table_b,当然,为了完成,必须创建迁移。所以你得到[time]_create_table_b迁移。

突然间,您决定创建table_a,并且与上一个表[time]_create_table_a一样创建了迁移,因此您的迁移文件夹看起来像这样:

/Migrations
/---[time]_create_table_b
/---[time]_create_table_a

现在,我们很酷。

那么!您改变 table_b 以使外键引用 table_a 的ID,您迁移,当然,它会到达必须创建引用的点,然后oups!没有 table_a.id

因此,您可能需要考虑迁移创建的时间顺序。

简单来说:

您希望将外键放在table_a旁边以引用table_b的ID,您的迁移应该是这样的:

[time]_create_table_a.php 
[time].create_table_b.php

首先创建table_a,并且随着table_b的创建继续,它会找到要引用的内容!

对于那些懒惰的人来说更简单:

  1. 删除所有迁移。
  2. 创建表的迁移,以获取哪些键是外来的。
  3. 创建包含对外键引用的表的迁移。
  4. 希望我帮助过。