1

私は最近、かなり不可解な状況に遭遇しました。2つのフィールドに一意の制約が設定されているテーブルには、この制約に違反する既存のレコードが多数あります。

そして、主な質問は 、独自の制約がすでに設定されている状態で、そもそもどうやってそこに到達できたのかということです。

スキーマ:

CREATE TABLE `rest_service_mediafile` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `video_id` int(11) NOT NULL,
  `video_encoding_id` int(11) NOT NULL,
  `external_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `rest_service_mediafile_video_id_4a2efdd4_uniq` (`video_id`,`video_encoding_id`),
  KEY `rest_service_mediafile_5d9d774` (`video_id`),
  KEY `rest_service_mediafile_62de6709` (`video_encoding_id`),
  CONSTRAINT `video_encoding_id_refs_id_3122bd65` FOREIGN KEY (`video_encoding_id`) REFERENCES `rest_service_videoencoding` (`id`),
  CONSTRAINT `video_id_refs_id_567c8704` FOREIGN KEY (`video_id`) REFERENCES `rest_service_video` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=93154 DEFAULT CHARSET=utf8

サンプルクエリ:(ただし、これだけが重複しているわけではありません)

mysql> select id, video_id, video_encoding_id, external_id from rest_service_mediafile where video_id = 157165 and video_encoding_id=2;
+-------+----------+-------------------+-------------+
| id    | video_id | video_encoding_id | external_id |
+-------+----------+-------------------+-------------+
| 82416 |   157165 |                 2 |           0 | 
| 82424 |   157165 |                 2 |           0 | 
+-------+----------+-------------------+-------------+

そして、次のようなフィールドでテーブルの変更クエリを試してみると、次のようになります。

ALTER TABLE rest_service_mediafileMODIFY external_idvarchar(255)NULL;

制約エラーが発生します:エラーは次のとおりです:(1062、"キー'rest_service_mediafile_video_id_4a2efdd4_uniq'の重複エントリ'157165-2'")

また、単純に重複した値を挿入しようとすると、正しく失敗します。MySQLでこれが可能なシナリオに遭遇した人はいますか?

4

1 に答える 1

1

制約は事後的に追加されましたか?

バグ: ALTER IGNORE TABLE t ADD UNIQUE INDEX は、MySQL 5.1 および 5.5 で重複する行を削除しません。

これは InnoDB のドキュメントにLimitation of Fast Index Creationとして記載されています。

于 2012-08-23T20:43:16.657 に答える