編集:私は私が私のために話すためのコードが必要だと思う...挿入の前にデータベースの一意性チェック?
私の問題についての簡単な例。
データベース内のユーザーを作成すると、電子メールとユーザー名は一意です。一意性チェックが合格しない場合は、エラーの原因となっているフィールド/列/を正確に知る必要があります。私が間違って何
void createUser(String email, String username, String password)
throws EmailExistingException, UsernameExistingException
{
//TODO: Create the user or throw exception according to error.
}
悪いアプローチ
void createUser(String email, String username, String password)
throws EmailExistingException, UsernameExistingException
{
//Do some query first.
if (emailExists(email)) throw EmailExistingException;
if (usernameExists(username)) throw UsernameExistingException;
//TODO: Create the user.
}
を実装したい何
- 挿入前に典型的なチェック、受け入れられるつもりはありません。あまりよくない何
それほど悪くアプローチ
//During database creation
db.users.setUnique("email", true);
db.users.setUnique("username", true);
void createUser(String email, String username, String password)
throws UserCreationException
{
try {
//TODO: Create the user.
} catch (SomeSortOfDatabaseException e) {
throw UserCreationException("some message", e);
}
}
- それは私がちょうどエラーコードと文字列メッセージと例外を取得する可能性があります。しかし、私は、ユーザが複写されたフィールドを知ってそれに応じてそれを修正できるようにする必要があります。私はこのコードではできません。たぶんDBドライバのエラーによって非常に具体的な詳細が得られるかもしれませんが、将来的にデータベースを変更したい場合は、ドライバに頼るのは良い方法ではないと思います。
私のアプローチ
//During database creation
db.users.setUnique("email", true);
db.users.setUnique("username", true);
void createUser(String email, String username, String password)
throws EmailExistingException, UsernameExistingException
{
try {
//TODO: Create the user.
} catch (SomeSortOfDatabaseException e) {
if (emailExists(email)) throw EmailExistingException;
if (usernameExists(username)) throw UsernameExistingException;
throw ServerException("some message", e);
}
}
それは実際に良くなっていますが、私は多くの(現実の世界では、これらのユニークなフィールドの多くは、あなたは私が言っているものを知って、変更することができる)というのが私の現在のアプローチは好きではありません。ですから、実際の生産でこの問題の一般的なアプローチは何か不思議です。すべての意見をいただければ幸いです。
どのデータベースですか?これをネイティブにサポートするデータベースもあります。 – Bohemian
'一部のデータベースがこれをネイティブにサポートしています。'私はそれほど悪い方法ではないと言いました。とにかく、どのデータベースがそれをサポートしているのか、それがどのように行われているのか、もちろんスレッドの安全性について聞きたいです。 – toyknight
mysqlには、例えば、重複キーの更新...があります。 – Bohemian