为什么我在使用Laravel Migrations Schema Builder创建表时遇到问题?
带有自引用外键的表会出现此问题。
Schema::create('cb_category', function($table)
{
$table->integer('id')->primary()->unique()->unsigned();
$table->integer('domain_id')->unsigned();
$table->foreign('domain_id')->references('id')->on('cb_domain');
$table->integer('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade');
$table->string('name');
$table->integer('level');
});
SQLSTATE[HY000]: General error: 1005 Can't create table 'eklik2.#sql-7d4_e' (errno: 150) (SQL: alter table
cb_categoryadd constraint cb_category_parent_id_foreign foreign key (
parent_id) references
cb_category(
id) on delete cascade on update cascade) (Bindings: array ())
[PDOException]
SQLSTATE[HY000]: General error: 1005 Can't create table 'eklik2.#sql-7d4_e' (errno: 150)
8条答案
按热度按时间z5btuh9x1#
你必须把它分成两个Schema块,一个创建列,另一个添加FK。mysql不能同时做这两件事。
kcwpcxri2#
两个查询起作用:
zlwx9yxi3#
我可能来不及参加聚会了,但是官方文档声称,如果是整数,则外键必须是
->unsigned();
http://laravel.com/docs/4.2/schema#foreign-keys
注意:创建引用递增整数的外键时,请记住始终使外键列无符号。
此外,Artisan不会失败,如果您(正如我所做的)拼错了
unsigned()
,我已经花了相当多的时间试图找出为什么没有创建密钥。所以有两件事:1.在整数递增的情况下,始终使外键列无符号2.检查
unsigned()
的拼写csbfibhn4#
也是一个延迟响应,但可能是Laravel 8的一个更习惯的方式:
**请注意:**我猜这里的类名是
CbCategory
。使用第一手的类引用(而不是以前的表名字符串)使静态代码检查器能够在将来发现类名的更改。此外,
parent_id
列名中的_id
-后缀也很重要。愿以下资源满足您的求知欲:
foreignIdFor()
:https://laravel.com/api/8.x/Illuminate/Database/Schema/Blueprint.htmlcascadeOnDelete()
和cascadeOnUpdate()
:https://laravel.com/api/8.x/Illuminate/Database/Schema/ForeignKeyDefinition.html4dbbbstv5#
试试这个
yk9xbfzb6#
我认为您有另一个表引用了您要创建的当前表。我遇到了这个问题,删除该表后问题就解决了
yjghlzjz7#
在将“$table-〉integer('parent_id')-〉unsigned()”更改为“$table-〉bigInteger('parent_id')”后,我使用此代码时遇到相同的错误;我的问题解决了
这里的要点是确保外键的类型与主键的类型相同。
yeotifhr8#
从Laravel 8+开始,你不需要分成两个Schema块,你可以使用
foreignIdFor(CbCategory::class, 'cb_category_id')
,它会创建一个名为cb_category_id
的列前。
您可以在foreignIdFor中使用第二个参数作为引用列名(如果它不是"id")不是您希望它具有的名称,在您的情况下,名称将自动为"cb_category_id"