我在从Laravel应用程序中删除一些外键时遇到问题。问题是当我尝试回滚迁移时:
php artisan migrate:rollback
我不知道为什么我在控制台中出错:
[照亮\数据库\ QueryException] SQLSTATE [42000]:语法错误或访问冲突:1091 DROP' role_user_user_id_foreign&#39 ;;检查列/密钥是否存在(SQL:alter table
role_user
drop foreign keyrole_user_user_id_foreign
)[学说\ DBAL \驱动\ PDOException] SQLSTATE [42000]:语法错误或访问冲突:1091 DROP' role_user_user_id_foreign&#39 ;;检查列/密钥是否存在
[PDOException] SQLSTATE [42000]:语法错误或访问冲突:1091 DROP' role_user_user_id_foreign&#39 ;;检查列/密钥是否存在
下面我显示了我的迁移类:
class UpdateRoleUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
schema::table('role_user',function(Blueprint $table){
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('role_id')->references('id')->on('roles');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('role_user', function (Blueprint $table) {
$table->dropForeign('role_user_user_id_foreign');
$table->dropForeign('role_user_role_id_foreign');
});
}
}
数据库中的我的表已由迁移类创建:
class CreateRoleUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('role_id')->unsigned();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('role_user');
}
}
答案 0 :(得分:6)
在Laravel的所有> 4.0版本中,它允许将列名放入一个数组中,然后它将自行解析。我试图找到随附的文档,但他们似乎已将其删除了。
在更新迁移中,请尝试以下操作:
Schema::table('role_user', function (Blueprint $table) {
$table->dropForeign(['user_id']);
$table->dropForeign(['role_id']);
});
答案 1 :(得分:1)
我在下面修改了你的代码。
将onUpdate()
和public function up()
{
Schema::table('role_user',function(Blueprint $table) {
$table->foreign('user_id')->references('id')->on('users')->onDelete('CASCADE')->onUpdate('CASCADE');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('CASCADE')->onUpdate('CASCADE');
});
}
添加到您的代码中。
public function down() {
Schema::table('role_user', function (Blueprint $table) {
$table->dropForeign(['user_id']);
$table->dropForeign(['role_id']);
});
}
function setTargeting(config, done) {
config.targeting = getTargeting(config.slot);
delete config.prebid;
done(config);
}
答案 2 :(得分:1)
我只是遇到了这个问题,问题是由于{
lock_guard<mutex> l(mutex);
critical section A
}
func_A();
{
lock_guard<mutex> l(mutex);
critical section B
}
删除了索引而不是列本身。解决方法是在$table->dropForeign([column_name]);
函数中将索引放在一个块中,然后将实际列放在单独的块中。必须将它们放在单独的块中,这是因为某些原因与无法在删除列的位置相同的连接中删除键有关。
因此down
函数应如下所示:
down
现在您可以运行public function down() {
// drop the keys
Schema::table('role_user', function (Blueprint $table) {
$table->dropForeign(['user_id']);
$table->dropForeign(['role_id']);
});
// drop the actual columns
Schema::table('role_user', function (Blueprint $table) {
$table->dropColumn('user_id');
$table->dropColumn('role_id');
});
}
来运行php artisan migrate
函数,并运行up
来运行php artisan migrate:rollback
命令,并且错误不再显示。