[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 メーリングリストの案内