【问题标题】:How to find the name of a unique index? MySQL如何找到唯一索引的名称? MySQL
【发布时间】:2018-10-31 11:45:01
【问题描述】:

我有这样的东西。我想删除列上的 unique 索引:long_col_namesome_other_id。由于表名和列名都很长,而且三个都有下划线,我该如何删除这个唯一索引?

mysql> SHOW INDEXES FROM long_table_name;
+--------------------------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table                    | Non_unique | Key_name | Seq_in_index | Column_name    | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------------------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| long_table_name          |          0 | PRIMARY  |            1 | id             | A         |          32 |     NULL | NULL   |      | BTREE      |         |               |
| long_table_name          |          0 | unique   |            1 | long_col_name  | A         |          32 |     NULL | NULL   |      | BTREE      |         |               |
| long_table_name          |          0 | unique   |            2 | some_other_id  | A         |          32 |     NULL | NULL   |      | BTREE      |         |               |
+--------------------------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

我正在使用 Laravel,但我只需要在 Laravel 或 MySQL 中都可以使用的东西。

唯一键是不是叫这个...long_table_name_long_col_name_some_other_id_unique

如何在mysql中删除这样的索引?

ALTER TABLE long_table_name DROP ???;

或者使用 Laravel..

        if (Schema::hasColumn('long_table_name', 'long_col_name')) {
            Schema::table('long_table_name', function (Blueprint $table) {
                $table->dropUnique('long_table_name_long_col_name_some_other_id_unique');
            });
        }

给出错误...

SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'long_table_name_long_col_name_some_other_id_unique'; check that column/key exists (SQL: alter table `long_table_name` d  
rop index `long_table_name_long_col_name_some_other_id_unique`)  

当我这样做时,我得到了同样的错误......

$table->dropUnique(['long_col_name','some_other_id']);

有什么想法吗?

【问题讨论】:

  • This SO question 在这里可能会有所帮助。您的问题似乎与 how 删除唯一约束无关,而是如何找到约束的名称。
  • 谢谢。唯一键的实际名称是“唯一”,这就是 OP 表中的内容,所以也许我不应该感到惊讶。

标签: mysql laravel-5 unique-key


【解决方案1】:

首先您需要检查表中是否存在索引,如果存在则使用 Collection 获取键名并将其转换为数组。检查键是否在数组中,如果没有删除,则可以将索引添加到相应的列。

 $key_names = collect(DB::select("SHOW INDEXES FROM long_table_name"))->pluck('Key_name')->toArray();



if (in_array("long_table_name_long_col_name_some_other_id_unique", $key_names)) {
            Schema::table('long_table_name', function (Blueprint $table) {
                $table->dropIndex( 'long_table_name_long_col_name_some_other_id_unique');
            });
        }

【讨论】:

  • 谢谢,我关注了@Tim-Biegeleisen 的链接,该链接确认密钥名称实际上是“唯一的”。一旦我有了它,它就是$table->dropIndex( 'unique');
猜你喜欢
  • 2019-01-01
  • 2015-11-18
  • 2022-01-02
  • 1970-01-01
  • 2020-11-13
  • 2018-07-28
  • 2010-09-28
相关资源
最近更新 更多