Как найти название уникального индекса? MySQL - PullRequest
0 голосов
/ 31 октября 2018

У меня есть что-то вроде этого. Я хочу удалить уникальный индекс для столбцов: long_col_name и some_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']);

Есть идеи?

1 Ответ

0 голосов
/ 31 октября 2018

Сначала необходимо проверить, присутствуют ли индексы в таблице. Если это так, получить имя ключа с помощью 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');
            });
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...