2011-03-07 30 views
5

URL'leri benzersiz anahtarlar olarak depolayan bir MySQL tablom var. Anahtarlarımda çakışmalara başlıyorum çünkü tuşların kendileri sadece ilk 64 bayt (ya da tercih ederseniz karakterleri, bir latin-1'i herhangi bir url). Yani bir URL 64 karakterden fazlaysa ve zaten benzer bir URL'ye sahibim, bir hata atar. ÖrneğinMyISAM benzersiz anahtarları 64 baytta kesiliyor ve çarpışmalara neden oluyor

:

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

Isnt MyISAM 1000 bayt anahtar uzunluklara sahip gerekiyordu:

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' 

bu hata Atar?

DÜZENLEME:

ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC) ; 
: Böyle 256'dan birini ayarlamak çalıştı

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 

: CREATE TABLE STATUS listelenen bir önek uzunluğu Bu gibi görünüyor diyoruz Orada görünmüyor

ve aşağıdaki hata var: Ben Alte ran çünkü geri dönüş sadece olduğunu düşünüyorum

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 üzerinden R TABLO. Yalnızca (endeksinin uzunluğunu belirterek) bir önek kullanan bir dizin oluşturduğunuzda

+0

Bağlantılar tablonuzda 'show create table' yapın. Endeks muhtemelen 64. –

cevap

2

ardından önek 1000 bayt (7.5.1 Column Indexes bakınız) kadar olabilir. Dizinin gerçek uzunluğunu öğrenmek için SHOW CREATE TABLE kullanın.

+0

bir uzunluğu ile tanımlanmıştır @Oswald ne dedi ile katılıyorum. Resmi belge şöyle diyor: ([link] (http://dev.mysql.com/doc/refman/5.1/en/create-index.html)): 'Sadece sütun değerlerinin önde gelen kısımlarını kullanan dizinler oluşturulabilir. Bir belirtmek için col_name (length) sözdizimini kullanma ...> Aynı sorunla karşılaştım, ancak chars boyutunda 64 için dizin öneki uzunluğu varsayılan olarak belirten herhangi bir resmi belge bulamıyorum. sütun gt 64 gibi ve dizin öneki uzunluğunu belirtmediniz. – lyfing

8

Hata mesajının yalnızca ilk 64 karakteri gösterdiğine inanıyorum, ancak bu kısıtlamanın 64 karakterle sınırlı olmadığı anlamına gelmiyor.

SHOW CREATE TABLE çıktınız doğruysa, dizin tüm 500 karakterden oluşur ve tam olarak çoğaltılır.

+1

Ayrıca, birincil anahtarın uzunluğu ile hiçbir ilgisi olmadığı zaman 64 karakterde kesilmiş bu hatayı gördüm. (MySQL Ver 14.14 Dağıt 5.1.61) – Flimm