2011-10-25 3 views
2
INSERT INTO users (firstname, lastname, email, mobile) VALUES ('Karem', 'Parem', '[email protected]', '123456789'); 

これは私がやりたいことですが、同じ電子メール[email protected]の行がすでに存在する場合は、これらの値でその行を更新する必要があります。 挿入して既に存在する場合は、列を更新します。SQL

私は http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.htmlが見つかりましたが、私はそれが

+1

特に理解していないものはありますか?あなたはそれを試しましたか?何が起こった?これまでに何を持っていますか? –

+0

可能な複製[存在する場合はどのように更新するのですか?MySQLに登録していない場合は挿入しますか?](http://stackoverflow.com/questions/1218905/how-do-i-update-if-exists-インサート - ノ - アップ - アップサルト - または - マージ - イン - mysqlの) –

答えて

5

使用ALTER TABLEこのクエリを試行しemail列に一意制約を追加するには:

INSERT INTO users(firstname, lastname, email, mobile) 
VALUES ('Karem', 'Parem', '[email protected]', '123456789') 
ON DUPLICATE KEY UPDATE 
    firstname = 'Karem', 
    lastname = 'Parem', 
    email = '[email protected]', -- you can probably omit this 
    mobile = '123456789' 

は、しかし注意してください - あなたは(主キーなど、あなたのテーブルの上に定義された他のユニークなキーを持っている場合は、定義上ユニークなものです)、更新をトリガーすることもできます。

+0

非常に素晴らしい機能! –

+0

私はその電子メールが一意に見えるはずの電子メールをどうすればいいのですか?電子メールには、インデックス名が "uniq_email"のユニークなインデックスがあります。 – Karem

+0

@ Karem:できません。 MySQLはすべてのユニークなインデックスを考慮します。 –

1

あなたはtriggersを使用しますが私見挿入する前に、主キーの存在をチェックすることにより、この目標を達成理解しない/更新が、より適切である:

  • トリガーのかもしれません並行性の問題につながる、 '挿入または更新'はトランザクションを使用してそのような問題から守ることができます
  • あなたのコードはより読みやすくなります
  • より効率的になります
関連する問題