我的迁移文件出错。但是我无法找到任何错误解决方案。当我运行迁移命令时,我在以下系统上出现错误。
[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错误的引用,这通常源于数据类型不匹配。您必须检查完全匹配的外键和主键类型。
答案 0 :(得分:1)
根据MySQL InnoDB Error Codes:
如果错误消息引用错误150,则表创建失败,因为未正确形成外键约束。
检查PowerCuts.TownID
和Towns.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
的创建继续,它会找到要引用的内容!
对于那些懒惰的人来说更简单:
希望我帮助过。