Laravel 迁移:使用外键更改列
Laravel migration: Alter column with foreign key
我试图在 drop fk 之后更改列默认值,但仍然出现错误:
SQLSTATE[HY000]: General error: 1832 Cannot change column 'training_status_id': used in a foreign key constraint 'fk_user_training_training_status1_idx' (SQL: ALTER TABLE user_training CHANGE training_status_id training_status_id INT DEFAULT 1)
迁移代码:
Schema::table('user_training', function ($table) {
$table->dropForeign('fk_user_training_training_status1_idx');
$table->integer('training_status_id')->default(1)->change();
$table->foreign('training_status_id', 'fk_user_training_training_status1_idx')
->references('id')->on('training_status')
->onDelete('set null')
->onUpdate('cascade');
});
可能是因为你的数据库有数据,可以使用disableForeignKeyConstraints();忽略约束:
Public up function(){
Schema::disableForeignKeyConstraints();
Schema::table('user_training', function ($table) {
$table->dropForeign('fk_user_training_training_status1_idx');
$table->integer('training_status_id')->default(1)->change();
$table->foreign('training_status_id', 'fk_user_training_training_status1_idx')
->references('id')->on('training_status')
->onDelete('set null')
->onUpdate('cascade');
});
Schema::enableForeignKeyConstraints();
}
列“training_status.id”无符号,因此列“user_training.training_status_id”也必须无符号 ,所以我需要指定修饰符“unsigned()”。
此外,在这种情况下,迁移中不需要删除并重新创建外键:
Schema::table('user_training', function ($table) {
$table->integer('training_status_id')->default(1)->unsigned()->change();
});
我试图在 drop fk 之后更改列默认值,但仍然出现错误:
SQLSTATE[HY000]: General error: 1832 Cannot change column 'training_status_id': used in a foreign key constraint 'fk_user_training_training_status1_idx' (SQL: ALTER TABLE user_training CHANGE training_status_id training_status_id INT DEFAULT 1)
迁移代码:
Schema::table('user_training', function ($table) {
$table->dropForeign('fk_user_training_training_status1_idx');
$table->integer('training_status_id')->default(1)->change();
$table->foreign('training_status_id', 'fk_user_training_training_status1_idx')
->references('id')->on('training_status')
->onDelete('set null')
->onUpdate('cascade');
});
可能是因为你的数据库有数据,可以使用disableForeignKeyConstraints();忽略约束:
Public up function(){
Schema::disableForeignKeyConstraints();
Schema::table('user_training', function ($table) {
$table->dropForeign('fk_user_training_training_status1_idx');
$table->integer('training_status_id')->default(1)->change();
$table->foreign('training_status_id', 'fk_user_training_training_status1_idx')
->references('id')->on('training_status')
->onDelete('set null')
->onUpdate('cascade');
});
Schema::enableForeignKeyConstraints();
}
列“training_status.id”无符号,因此列“user_training.training_status_id”也必须无符号 ,所以我需要指定修饰符“unsigned()”。 此外,在这种情况下,迁移中不需要删除并重新创建外键:
Schema::table('user_training', function ($table) {
$table->integer('training_status_id')->default(1)->unsigned()->change();
});