[jpa:97] MySQLの一意制約違反を表すエラーコード

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2008年 4月 1日 (火) 20:22:12 JST


中村(taedium)です。

MySQLが返すエラーコードですが、
「Error: 1022 SQLSTATE: 23000  (ER_DUP_KEY)」と
「Error: 1062 SQLSTATE: 23000  (ER_DUP_ENTRY)」の
違いをご存知の方がいたら教えていただきたいです。

これを知りたい背景は、
JPAで本当に一意制約違反が発生したかどうかを
エラーコードで判別したいからです。

JPAでは一意制約違反の発生を示す例外として
EntityExistsExceptionが用意されていますが、
HibernateやToplink Essentialsでは、
一意制約違反かどうかに関係なく何らかの制約違反で
あれば(NotNull制約違反など)この例外をスローしてしまっています。

本当に一意制約違反が発生したかどうかを知るには
RDBMSごとに原因となったSQLExceptionのgetSQLSate()メソッドや
getErrorCode()メソッドが返す値から判別するしかなさそうです。

MySQL 5.0.45では、一意制約違反が発生すると
SQLException#getErrorCode()メソッドは1062を返します。
# 重複する主キーや一意キーをINSERTしてみて確かめました。

ただ、マニュアルを見ると1062によく似ている1022があって
違いがわかりませんでした。

http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html

場合によっては、一意制約違反で1022が返されるときがあるのでしょうか?

-- 
Nakamura Toshihiro <[E-MAIL ADDRESS DELETED]>



jpa メーリングリストの案内