我有一个calls
表,其中包含user\u id
列和一个外键约束。因此,用户id与用户
表相关。
我进行了迁移,删除了列和外键约束。up
方法工作正常。但是,当谈到down
时,它会崩溃,因为我添加了一个user\u id列,然后恢复约束,但是该列中的值与实际数据无关,所以我得到了150个MySQL错误。
我找到了一个不适合我的解决方案。解决办法是暂时禁用外键约束。这是我的迁移文件:
使用Illumb\Database\Schema\Blueprint;使用\Database\Migrations\Migration;
class RemoveUseridFromCalls extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('calls', function(Blueprint $table)
{
$table->dropForeign('calls_user_id_foreign');
$table->dropColumn('user_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
\DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::table('calls', function(Blueprint $table)
{
$table->integer('user_id')->unsigned();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('set null');
});
\DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
}
但我还是犯了同样的错误。
所以,问题是:
>
如果你需要从列表中删除user_id
,因为它不再需要了,但是你必须写下方法和上方法,你会怎么做?
为什么禁用外键检查不起作用?
我使用InnoDB
作为我所有表的表类型。
在处理迁移时检查表中的外键可以如下:
$keyExists = DB::select(DB::raw('SHOW KEYS FROM TABLE_NAME WHERE Key_name=\'YOUR_FOREIGN_KEY_NAME\''));
if(!$keyExists){
$table->foreign('app_id')
->references('id')
->on('apps')
->onDelete('cascade');
}
我也有同样的问题,并通过将迁移分离到几个文件来修复它。第一个创建表,其他的为键和键本身添加列。
从那以后,一切都开始运转起来。
您只需使用onDelete('cascade')
。
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('calls', function(Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade'); // use 'cascade'
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('calls');
}
}
onDelete('cascade')
告诉Laravel删除一个调用的
行,当它对应的外键用户id
被删除时。
本文向大家介绍Django 处理迁移,包括了Django 处理迁移的使用技巧和注意事项,需要的朋友参考一下 示例 Django使用迁移将您对模型所做的更改传播到数据库。django大多数时候都可以为您生成它们。 要创建迁移,请运行: 这将在的migration子模块中创建一个迁移文件app_name。第一个迁移将被命名0001_initial.py,另一个将以开头0002_,然后0003是...
我已经创建了一个迁移文件,并在数据库中创建了表。现在,我想向现有迁移文件添加新列。我要做的是,打开迁移文件并在up()函数中添加列名,添加列名后,运行命令 如何向现有表中添加新列?
获取以下异常: 预期: TableInfo{name='chat_table',Columns={message=column{name='message',type='text',affinity='2',notnull=false,primarykeyposition=0},messageStatus=column{name='message status',type='text',affin
java.lang.IllegalStateException:迁移未正确处理data_table 应为:TableInfo{name=“data_table”,columns=url=column{name=“url”,type=“text”,notnull=false,primarykeyposition=0}..... 找到:TableInfo{name='data_table',colum
我目前正在研究Flyway作为Liquibase的替代方案,但在文档中无法找到以下问题的答案: 假设在生产环境中部署后发现迁移包含错误。回想起来,不应该按原样执行,但已经太晚了。但是,我们想用固定版本的替换迁移,这样从头开始填充的数据库就不会遭受相同的错误。 在 Liquibase 中,您将修复原始变更集并使用
预期: 找到TableInfo{name='user',Columns={name=Column{name='name',Type='text',NotNull=False,PrimaryKeyPosition=0},Age=Column{name='Age',Type='integer',NotNull=True,PrimaryKeyPosition=0},ID=Column{name='id'