2016-03-28 20 views
1

おはようございます。以下は、私のデータベースに同じ値を持つデータベースを確認してください。

String sql = "Insert into userinfo(firstname,lastname,contactNumber,email,address,username,password,accountType) value (?,?,?,?,?,?,?,?)"; 
String accountType = (String) jComboBoxAccType.getSelectedItem(); 
PreparedStatement ps = conn.prepareStatement(sql); 
ps.setString(1, jTextFieldFistName.getText()); 
     ps.setString(2, jTextFieldLastName.getText()); 
     ps.setString(3, jTextFieldContactNumber.getText()); 
     ps.setString(4, jTextFieldEmail.getText()); 
     ps.setString(5, jTextFieldAddress.getText()); 
     ps.setString(6, jTextFieldUsername.getText()); 
     ps.setString(7, jTextFieldPassword.getText()); 
     ps.setString(8, accountType); 
     ps.execute(); 

どのように私は、既存のユーザー名とパスワードを追加する前にすでに存在しているかどうかを確認することができるだろうにアイテムを追加するに私のコードはありますか?

+0

あなたは、例えば、単純に選択クエリを作成することができます。または、テーブルにUNIQUEインデックスを追加すると、既に存在する場合はそのコードがSqlExceptionをスローします。 –

+1

まず選択を実行し、データがすでに存在するかどうかを確認します –

答えて

1

通常、データベースにそのようなデータ整合性ルールを適用させたいとします。これにより、データが正しいことが保証されます。競合状態(本質的に同時に発生する2つの挿入、つまりテーブルが重複していないことを検証してから両方が同じ値を挿入する)が導入されるため、アプリケーションレベルでチェックする必要はありません。

一意性を保証するには、一意性制約または一意インデックスを使用します(前者は後者を使用して実装されます)。重複した値が挿入されると、エラーが発生します。作成することは簡単です:

alter table userinfo add constraint unq_username_password unique (username, password); 

通常、ユーザーが唯一の1つのパスワードを持つことになり、その制約はユーザー名のみになり、言ったことは:

alter table userinfo add constraint unq_username unique (username); 
+0

これは私が推奨する第2の方法です。 –

0

あなたはこのコード

ようなものが必要
PreparedStatement ps=connection.prepareStatement("select 1 from userinfo where username=? and password=?"); 
ps.setString(1, jTextFieldUsername.getText()); 
ps.setString(2, jTextFieldPassword.getText()); 
ps.execute(); 
if (ps.getResultSet.next()) { 
// So, user and password already in database 
} 
else { 
// Insert value... 
} 

しかし、私のためとして、データベースに新しいユーザーを追加する時に(ユーザ名、パスワード)の既存の同じペアを確認することは良いアイデアではありません。

0

チェックを実行するには3種類の方法があります。

1)検索クエリを作成しますが、同じユーザー名とパスワードを持つレコードが存在する場合は、何かのように:

SELECT COUNT(*) as exists FROM userinfo WHERE username = :username AND password = :password 

または

SELECT username as exist FROM userinfo WHERE username =:username AND password =:password

したがって、重複したレコードが見つかった場合は、「存在する」フィールドdは0またはNULL以外の値を返します。

2)ユーザ名とパスワードの両方にユニークなインデックスを作成するだけです。重複したレコードを挿入しようとすると、エラーが発生するため、「try ... catch」文を"ps.execute"重複する値が存在するかどうかを確認するサブクエリを追加

3)(参照:https://stackoverflow.com/a/3025332/1641558

0

はあなたが唯一のようにクエリを変更する必要があり、

Insert ignore into userinfo(firstname,lastname,contactNumber,email,address,username,password,accountType) value (?,?,?,?,?,?,?,?) 
関連する問題