Существует таблица с именем contracts
со следующей структурой:
MariaDB [db_name]> DESCRIBE `contracts`;
+-----------------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| number | varchar(255) | YES | | NULL | |
| service_name | varchar(255) | YES | | NULL | |
| begin_date | date | YES | | NULL | |
| end_date | date | YES | | NULL | |
| main_contract | varchar(255) | YES | | NULL | |
| status | varchar(255) | YES | | NULL | |
| uuid | varchar(36) | YES | | NULL | |
| database_id | int(11) | YES | | NULL | |
| abonent_uuid | varchar(36) | YES | MUL | NULL | |
| deleted | tinyint(1) | YES | MUL | 0 | |
| active | tinyint(1) | YES | | NULL | |
| payment_condition_name | varchar(255) | YES | | NULL | |
| payment_condition_form_type | varchar(255) | YES | | NULL | |
| gas | tinyint(1) | NO | | 0 | |
| service_uuid | varchar(36) | YES | | NULL | |
| document_type | int(11) | YES | | NULL | |
| document_id | varchar(255) | YES | | NULL | |
| document_status | varchar(255) | YES | | NULL | |
| signed | tinyint(1) | YES | | 0 | |
| saved | tinyint(1) | YES | MUL | 0 | |
| organization_code | varchar(255) | YES | | NULL | |
+-----------------------------+--------------+------+-----+---------+----------------+
23 rows in set (0.00 sec)
Существует уникальный составной индекс для abonent_uuid
и uuid
:
MariaDB [db_name]> SHOW INDEX FROM `contracts`;
+-----------+------------+----------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+----------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| contracts | 0 | PRIMARY | 1 | id | A | 384633 | NULL | NULL | | BTREE | | |
| contracts | 0 | index_contr_on_abon_uuid | 1 | abonent_uuid | A | 384633 | NULL | NULL | YES | BTREE | | |
| contracts | 0 | index_contr_on_abon_uuid | 2 | uuid | A | 384633 | NULL | NULL | YES | BTREE | | |
| contracts | 1 | index_contracts_on_deleted | 1 | deleted | A | 2 | NULL | NULL | YES | BTREE | | |
| contracts | 1 | index_contracts_on_saved | 1 | saved | A | 2 | NULL | NULL | YES | BTREE | | |
+-----------+------------+----------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
5 rows in set (0.00 sec)
Когда япопробуйте сделать mysqlcheck или OPTIMIZE (mysqlcheck -u root -p -o db_name
контракты) для этой таблицы, я получил эту ошибку:
db_name.contracts
note : Table does not support optimize, doing recreate + analyze instead
error : Duplicate entry '5661d82c-70d1-b019-3200-ca61e3f72e46-b9073669-4c3d-a089-6c2f-ddc' for key 'index_contr_on_abon_uuid'
status : Operation failed
Итак, у нас есть следующие конфликтующие uuids:
5661d82c-70d1-b019-3200-ca61e3f7
2e46-b9073669-4c3d-a089-6c2f-ddc
Или только их части, полные UUID имеют длину 36 байтов.Я не знаю, почему MariaDB обрезает их.Индексы были созданы с использованием этого запроса:
ALTER TABLE `contracts` ADD UNIQUE INDEX `index_contr_on_abon_uuid` (`abonent_uuid`, `uuid`);
Также я попробовал (тот же результат):
DROP INDEX `index_contr_on_abon_uuid` ON `contracts`;
ALTER TABLE `contracts` ADD UNIQUE INDEX `index_contr_on_abon_uuid` (`abonent_uuid`(36), `uuid`(36));
Но в таблице НЕТ неуникальных записей (даже еслимы обрезаем uuids):
MariaDB [db_name]> SELECT `abonent_uuid`, `uuid`
-> FROM `contracts`
-> GROUP BY SUBSTRING(`abonent_uuid`, 1, 32), SUBSTRING(`uuid`, 1, 32)
-> HAVING COUNT(*) > 1;
Empty set (8.36 sec)
Эта ошибка иногда исчезает, но иногда появляется снова и время от времени.Во время моих экспериментов на этой таблице не было произведено ни одной операции.
Следовательно, questions : ПОЧЕМУ возникает эта ошибка?КАК это исправить?
PS
Debian GNU / Linux 9 (растяжка)
mysql Ver 15.1 Distrib 10.1.38-MariaDB, дляdebian-linux-gnu (x86_64) с использованием readline 5.2
ENGINE = InnoDB;