2017-10-01 21 views
-1

私の要求は実現可能ですか?MySql条件付き挿入

私は管理者のパスワードで挿入を保護したいと思います。

INSERT INTO `user` (`id`, `pw`, `name`) VALUES (?,?,?) WHERE EXISTS (select * from `admin` where pw=?) 

ありがとうございます。

+3

これが達成するために何を意味するのかは私には分かりません。これが通常の 'INSERT'とは異なる何をすると思いますか? – David

+1

SQLの操作ごとにパスワードを確認して、管理者の状態をテストするのは非常に危険です。これは、パスワードを正しくハッシュしていないことを意味します.BcryptまたはScryptを使用して確認する必要がある場合、MySQLがサポートしていないものがあるからです。 – tadman

答えて

1

はい - しかし、あなたは、私がこれを書くために傾向があるINSERT

INSERT INTO `user` (`id`, `pw`, `name`) 
SELECT ?,?,? FROM dual WHERE EXISTS (select * from `admin` where pw=?) 
+0

その変更の理由を説明できますか?私はあなたが間違っていると言っているわけではありませんが、私たちが何をすることができるか、*なぜ*どうすればいいのか、知っているといいでしょう。 – Pshemo

+1

INSERT ... VALUESステートメントにWHERE句を追加することはできませんが、INSERT ... SELECTフォームにはWHERE句を付けることができます。それ以外の特別な理由は、言語が定義された方法ではありません。 –

1

のSELECT形式を使用する必要がありますあなたが二回(pwパラメータを含める必要はありません

INSERT INTO `user`(`id`, `pw`, `name`) 
    SELECT x.id, x.pw, x.name 
    FROM (SELECT ? as id, ? as pw, ? as name) x 
    WHERE EXISTS (select 1 from `admin` a where a.pw = x.pw); 

注意を私はこれがあなたが望むロジックだと仮定しています)。

さらに重要なことに、pwadminで正しく有効であることを確認したいと思われるようです。

alter table user add constraint fk_user_pw 
    foriegn key (pw) references admin(pw); 

次にあなたがinsertに特別なロジックを必要としない。これを行うには現実的な方法は、外部キー制約です。 pwの値が一致しないと失敗します。

これは、updateinsertでも有効です。

+0

ここでは良い答えを出していますが、プレーンテキストやひどくハッシュされたパスワードを確認して管理ステータスをテストするのは、実際には非常に悪い考えです。 – tadman