2011-07-17 9 views
1

照合順序を変更するだけで重複キーエラーが発生するのはなぜですか?フィールド照合順序をutf-8に変更すると、重複キーエラーが発生する

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 | 

答えて

2

フィールドの照合順序を変更する場合、おそらくMySQLは、同様UTF8にlatin1のからデータを変換しようとしています。この変換後に、item_number列のデータの一部に重複が含まれている可能性があります。おそらく、それはエラーのようです。

私はこれらの手順が競合行あるかを識別するのに役立つかもしれないと思う:

  1. は、すべての行のitem_idnameitem_number列を選択し、いくつかのXLSファイル内のエントリを保つおそらく
  2. ユニークインデックスを削除item_numberカラム
  3. 今すぐ正常に実行されるALTER TABLE文を実行します。
  4. ステップ1を実行して、ステップ1の出力と比較します。aどんなアイテムが同じ値を持っているのかを調べる

これは役に立ちます。

+0

行のスペース文字がありましたが、それを修正していました。 –

関連する問題