Изменение сопоставления поля на utf-8 вызывает ошибку дублированного ключа - PullRequest
2 голосов
/ 17 июля 2011

Почему простое изменение параметров сортировки приводит к ошибке дублированного ключа?

mysql> describe phppos_items;
+-----------------------+--------------+------+-----+---------+----------------+
| Field                 | Type         | Null | Key | Default | Extra          |
+-----------------------+--------------+------+-----+---------+----------------+
| name                  | varchar(255) | NO   | MUL | NULL    |                |
| category              | varchar(255) | NO   | MUL | NULL    |                |
| supplier_id           | int(11)      | YES  | MUL | NULL    |                |
| item_number           | varchar(255) | YES  | UNI | NULL    |                |
| description           | varchar(255) | NO   |     | NULL    |                |
| cost_price            | double(15,2) | NO   |     | NULL    |                |
| unit_price            | double(15,2) | NO   |     | NULL    |                |
| quantity              | double(15,2) | NO   |     | 0.00    |                |
| reorder_level         | double(15,2) | NO   |     | 0.00    |                |
| location              | varchar(255) | NO   |     | NULL    |                |
| item_id               | int(10)      | NO   | PRI | NULL    | auto_increment |
| allow_alt_description | tinyint(1)   | NO   |     | NULL    |                |
| is_serialized         | tinyint(1)   | NO   |     | NULL    |                |
| deleted               | int(1)       | NO   | MUL | 0       |                |
+-----------------------+--------------+------+-----+---------+----------------+
14 rows in set (0.01 sec)

mysql> ALTER TABLE  `phppos_items` CHANGE  `name`  `name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , CHANGE  `category`  `category` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , CHANGE  `item_number`  `item_number` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL , CHANGE  `description`  `description` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , CHANGE  `location`  `location` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
ERROR 1062 (23000): Duplicate entry ' ' for key 'item_number'

Создать таблицу:

| phppos_items | CREATE TABLE `phppos_items` (
  `name` varchar(255) CHARACTER SET latin1 NOT NULL,
  `category` varchar(255) CHARACTER SET latin1 NOT NULL,
  `supplier_id` int(11) DEFAULT NULL,
  `item_number` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
  `description` varchar(255) CHARACTER SET latin1 NOT NULL,
  `cost_price` double(15,2) NOT NULL,
  `unit_price` double(15,2) NOT NULL,
  `quantity` double(15,2) NOT NULL DEFAULT '0.00',
  `reorder_level` double(15,2) NOT NULL DEFAULT '0.00',
  `location` varchar(255) CHARACTER SET latin1 NOT NULL,
  `item_id` int(10) NOT NULL AUTO_INCREMENT,
  `allow_alt_description` tinyint(1) NOT NULL,
  `is_serialized` tinyint(1) NOT NULL,
  `deleted` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`item_id`),
  UNIQUE KEY `item_number` (`item_number`),
  KEY `phppos_items_ibfk_1` (`supplier_id`),
  KEY `name` (`name`),
  KEY `category` (`category`),
  KEY `deleted` (`deleted`),
  CONSTRAINT `phppos_items_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `phppos_suppliers` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1560 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

1 Ответ

2 голосов
/ 17 июля 2011

При изменении параметров сортировки полей, возможно, MySQL также пытается преобразовать данные из латиницы 1 в utf8. Возможно, после этого преобразования некоторые из ваших данных в столбце item_number содержат дубликаты, возможно, пробел - это символ ошибки.

Я думаю, что эти шаги могут помочь определить, какие конфликтующие строки:

  1. выберите item_id, name и item_number столбцы для всех строк и сохраните записи в некотором файле XLS, возможно,
  2. удалить уникальный индекс в столбце item_number 1013 *
  3. запустите оператор ALTER TABLE, который теперь должен успешно выполняться
  4. повторите шаг 1 и сравните выходные данные с выходом из шага 1 и выясните, для какого из элементов item_number имеет те же значения

Надеюсь, это поможет!

...