5

URL を一意のキーとして格納する MySQL テーブルがあります。キー自体が任意の URL の最初の 64 バイト (または必要に応じてラテン 1 照合された文字) にすぎないように見えるため、キーで衝突が発生し始めています。そのため、URL が 64 文字を超えていて、既に同様の URL を取得している場合、エラーがスローされます。

例えば:

SELECT l.link_id FROM mydb.links l WHERE 
url = 'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elected_Me_as_Their_Leader/index.html'

このエラーをスローします:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 
'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elec' for key 'url'

MyISAM の鍵の長さは 1000 バイトであるはずではありませんか?

編集:次のように見える CREATE TABLE STATUS 呼び出しにリストされているプレフィックス長がないようです:

CREATE TABLE `links` (
  `link_id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(500) NOT NULL,
  PRIMARY KEY (`link_id`),
  UNIQUE KEY `url` (`url`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

次のように 256 に設定しようとしました。

ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC) ;

次のエラーが発生しました。

ERROR 1062: Duplicate entry '<...64-byte key...>' for key 'url'
SQL Statement:
ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC)

ERROR: Error when running failback script. Details follow.

ERROR 1050: Table 'links' already exists

フォールバックは、MySQL Workbench を介して ALTER TABLE を実行したためだと思います。

4

2 に答える 2

10

エラー メッセージには最初の 64 文字しか表示されていないと思いますが、これは制約が 64 文字に制限されているという意味ではありません。

SHOW CREATE TABLE出力が正確な場合、インデックスは 500 文字すべてにあり、完全に重複しています。

于 2011-03-07T20:25:08.040 に答える
2

(インデックスの長さを指定して) プレフィックスのみを使用するインデックスを作成する場合、プレフィックスは最大 1000 バイトにすることができます(「7.5.1 カラム インデックス」を参照)。SHOW CREATE TABLEインデックスの実際の長さを調べるために使用します。

于 2011-03-07T19:27:36.767 に答える