私は最近、かなり不可解な状況に遭遇しました。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_mediafile
MODIFY external_id
varchar(255)NULL;
制約エラーが発生します:エラーは次のとおりです:(1062、"キー'rest_service_mediafile_video_id_4a2efdd4_uniq'の重複エントリ'157165-2'")
また、単純に重複した値を挿入しようとすると、正しく失敗します。MySQLでこれが可能なシナリオに遭遇した人はいますか?