2012-02-19 9 views
5

MySQLのユニークキーで問題があります。MySQLはユニークなインデックスを64文字に切り詰めました

URL、整数値、日付フィールドで構成されます。

しかし、私は行を挿入しようとすると、私は例外を取得:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'http://cars.auto.ru/cars/used/sale/16152870-c13f1.html-2012-02-1' for key 'one_a_day_idx' 

あなたが見ることができるように、構成指数は64文字で切り捨てられ、そしてこのために、それはもはや一意ではありませんして(I制約違反についての例外がスローされたものの「同様の質問0がありました

、)一日一回

を外部ソースからデータを取得しかし、レコードが挿入されたことを最も混乱メートルですが、SHOW CREATE TABLEを使用してインデックスの実際の長さを調べることが唯一のアドバイスでした。

ショーは、テーブルを作成するには、この示しています。だから、

| auto_ru_sale | CREATE TABLE `auto_ru_sale` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `template` int(11) NOT NULL, 
    `region` varchar(128) NOT NULL, 
    `URI` varchar(128) NOT NULL, 
    `subType` varchar(128) NOT NULL, 
    `cost` int(11) NOT NULL, 
    `productionYear` int(11) NOT NULL, 
    `engineVolume` int(11) NOT NULL, 
    `transmitionType` varchar(1) NOT NULL, 
    `run` int(11) NOT NULL, 
    `evaluationDate` date NOT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `one_a_day_idx` (`template`,`URI`,`evaluationDate`), 
    KEY `prodyear_idx` (`productionYear`), 
    KEY `evdate_idx` (`evaluationDate`), 
    CONSTRAINT `auto_ru_sale_ibfk_1` FOREIGN KEY (`template`) REFERENCES `auto_ru_ 
datatemplate` (`ID`) ON DELETE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=127012 DEFAULT CHARSET=utf8 | 

を、私は、インデックスの長さに制限事項が表示されません。

誰もがこの問題について助けてくれることに感謝します。

+0

問題の解決方法を見つけたことがありますか? VARCHAR(255)フィールドの一意のインデックスについても同様の問題があります。明らかに、JDBC/JPAは挿入しようとしている文字列値の最初の64文字を含むMySQLIntegrityConstraintViolationExceptionをスローします。しかし、同じ値をMySQL Workbench経由で直接挿入すると問題なく正常に動作します。これは、JPAまたはJDBCドライバに関連している可能性があると考えています。 – tvirtualw

+0

問題の解決策を見つけました。デフォルトでは、MySQL照合は大文字と小文字を区別しません。私たちがテーブルに挿入しようとした値は、同じ文字を持っていました。たった1文字は大文字、もう1文字は小文字に違います。 'abcd'と 'aBcd'のように。デフォルトの照合では、一意のインデックス違反が発生します(私は主キーと同じです)。 utf8_binに変更してから、私たちのために働いた。 – tvirtualw

答えて

1

私はあなたの正確な質問に答えられませんでしたが、データベースの時間を改善しながらそれを修正するべきです。

これは、そのキーになる意味するテーブルすなわちのURI(URI_id INT UNSIGNED PK AI、URI VARCHAR(128)NOT NULL、UNIQUE KEY(URI))を作成し、URI

の代わりにuri_id格納するauto_ru_saleを変更より効率的なINT、INT、DATEのキー。テーブルのサイズは重複が少なくなるため、小さくなります。すべてのすべての正規化は有益です。

"region"フィールドにも同じことをお勧めします。これは、重複データもたくさんあると想定しています。

関連する問題