我的迁移文件中有错误。但我找不到任何错误的解决方案。当我运行迁移命令时,我在以下系统中得到该错误。
[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');
});
谢谢,问候
3条答案
按热度按时间sulc1iza1#
根据MySQL InnoDB Error Codes:
如果错误消息指涉错误150,则数据表建立失败,因为外部索引键条件约束的格式不正确。
检查
PowerCuts.TownID
和Towns.TownID
是否为完全相同的类型(无符号整数),因为外键字段的类型必须与被引用列的类型相同。unftdfkk2#
免责声明:我知道这个问题已经得到了解答,但我将把这个答案留给遇到我的问题的任何人,以便将来进行咨询。
此错误通常意味着,在另一个表上引用的外键存在问题,主要原因是不兼容,例如在字符串行上引用整数等。
就像我的情况一样,引用的是一开始就不存在的东西。
"让我解释一下"
你要创建
table_b
,当然,要完成它,必须创建一个迁移,这样你就得到了[time]_create_table_b
迁移。突然,您决定创建
table_a
,并且与前面的表一样,创建了[time]_create_table_a
migration,因此您的migrations文件夹看起来如下所示:直到现在,我们都很冷静。
然后!您更改table_b,使其具有一个引用table_aid的外键,然后进行迁移,当然,它会到达必须创建引用的位置,并导致!notable_a.id!
因此,您可能需要考虑迁移创建的时间顺序。
简单来说:
您希望在
table_a
的一侧放置一个外键,以便引用table_b
的id,您的迁移应该是这样的:因此,首先创建
table_a
,随着table_b
的创建继续,它会找到要引用的内容!用更简单的话来说,对于那些懒惰的人来说:
1.删除所有迁移。
1.创建表的迁移,以获取哪些键是外键。
1.创建包含外键引用的表的迁移。
希望我能帮上忙。
3j86kqsm3#
我也遇到了这个错误。下面是解决方案。您需要在创建主表之前创建外表。请参见下图。enter image description here