Как найти имя уникального индекса? mysql

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

Любые идеи?

Этот ТАК вопрос может быть здесь полезен. Ваш вопрос, похоже, не имеет отношения к как для удаления уникального ограничения, а скорее к тому, как найти имена ограничений.
Tim Biegeleisen 31.10.2018 12:53

Спасибо. Фактическое имя уникального ключа было «unique», это то, что указано в таблице в OP, так что, возможно, мне не стоит удивляться.

sdexp 31.10.2018 13:25
0
2
520
1

Ответы 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');

sdexp 31.10.2018 13:23

Другие вопросы по теме