删除唯一索引 Laravel
Drop Unique Index Laravel
我在 运行 php artisan migrate
的时候一直收到这个
SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'email'; check that column/key exists
虽然我看到电子邮件存在于我的数据库中。
我的迁移脚本。我试图放弃唯一约束。
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AlterGuestsTable3 extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('guests', function(Blueprint $table)
{
$table->dropUnique('email');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('guests', function(Blueprint $table)
{
$table->dropUnique('email');
});
}
}
我是不是忘记清除缓存了?
对我有什么提示吗?
删除索引时,Laravel 会期望给出索引的全名。
您可以检查您的数据库以获取索引的全名,但如果键是由之前的 Laravel 迁移生成的,则其名称应符合单一、简单的命名约定。
以下是 documentation 对其命名约定的说明(从 v5.2 开始):
By default, Laravel automatically assigns a reasonable name to the indexes. Simply concatenate the table name, the name of the indexed column, and the index type.
我猜这就是您收到错误的原因。没有 email
索引,但可能有 guests_email_unique
索引。
试试这个迁移:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AlterGuestsTable3 extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('guests', function(Blueprint $table)
{
$table->dropUnique('guests_email_unique');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('guests', function(Blueprint $table)
{
//Put the index back when the migration is rolled back
$table->unique('email');
});
}
}
我知道创建索引时指定列名有点令人困惑,但稍后删除索引时需要提供索引的全名。
请注意,我也调整了 down()
方法,以便它通过添加回来恢复删除唯一索引。
通过official documentation您可以看到以下内容:
If you pass an array of columns into a method that drops indexes, the
conventional index name will be generated based on the table name,
columns and key type:
Schema::table('geo', function ($table) {
$table->dropIndex(['state']); // Drops index 'geo_state_index'
});
您只需在字段名称周围使用 []
即可删除它:
Schema::table('guests', function(Blueprint $table)
{
$table->dropUnique(['email']);
});
UPD:到 latest docs for 9.x 它仍然相关。
我在 运行 php artisan migrate
SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'email'; check that column/key exists
虽然我看到电子邮件存在于我的数据库中。
我的迁移脚本。我试图放弃唯一约束。
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AlterGuestsTable3 extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('guests', function(Blueprint $table)
{
$table->dropUnique('email');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('guests', function(Blueprint $table)
{
$table->dropUnique('email');
});
}
}
我是不是忘记清除缓存了?
对我有什么提示吗?
删除索引时,Laravel 会期望给出索引的全名。
您可以检查您的数据库以获取索引的全名,但如果键是由之前的 Laravel 迁移生成的,则其名称应符合单一、简单的命名约定。
以下是 documentation 对其命名约定的说明(从 v5.2 开始):
By default, Laravel automatically assigns a reasonable name to the indexes. Simply concatenate the table name, the name of the indexed column, and the index type.
我猜这就是您收到错误的原因。没有 email
索引,但可能有 guests_email_unique
索引。
试试这个迁移:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AlterGuestsTable3 extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('guests', function(Blueprint $table)
{
$table->dropUnique('guests_email_unique');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('guests', function(Blueprint $table)
{
//Put the index back when the migration is rolled back
$table->unique('email');
});
}
}
我知道创建索引时指定列名有点令人困惑,但稍后删除索引时需要提供索引的全名。
请注意,我也调整了 down()
方法,以便它通过添加回来恢复删除唯一索引。
通过official documentation您可以看到以下内容:
If you pass an array of columns into a method that drops indexes, the conventional index name will be generated based on the table name, columns and key type:
Schema::table('geo', function ($table) { $table->dropIndex(['state']); // Drops index 'geo_state_index' });
您只需在字段名称周围使用 []
即可删除它:
Schema::table('guests', function(Blueprint $table)
{
$table->dropUnique(['email']);
});
UPD:到 latest docs for 9.x 它仍然相关。