PHP+MYSQLでの環境で、レコードが存在していなか

Writer: admin Type: 友人関係の悩み Date: 2019-03-06 00:00
PHP+MYSQLでの環境で、レコードが存在していなかったらinsertをしたい場合、どうするのが一般的なのですか?調べたら、1つのSQLで済ます方法が載っていました。https://blogs.yahoo.co.jp/dk521123/34139759.htmlこういった方法は一般的に用いるんでしょうか?私が今までやっている方法は、まずレコードが存在するかどうかのSQL文を発行して、存在しなかったらinsertをするという二段階の手順を踏んでいます。1. select count(*) from table1 where 条件2.countが0の場合にinsert文を発行レコードが存在している場合にupdateをしたい時も同様です。ただ2段階なので、PHPのようなプログラムが使えるような環境でしかこの方法は使えないと思います。王道的な方法はどういう方法なのでしょうか。共感した0###一般的にマスタテーブルはレコードのプライマリキーが決まっていますから、そういうテーブルの話ではないのですよね?キー重複でinsert実行して既存であればduplicate keyで例外が発生しますから、それを捕捉して適宜処理する(「何もしない」というのもアリ)ことになります。#一般的にマスタテーブルなら必ず先に読んでいるハズですが、#挿入タイミングが被るケースも(レアですが)あるでしょう逆にデータテーブルだとしたら、何を基準に「存在する」と判断するのでしょうか?>select count(*) from table1 where 条件この「条件」というのはどういうものですか?>レコードが存在している場合にupdateをしたい時も同様です。このケースは、INSERT ... ON DUPLICATE KEY UPDATE 構文を使うのが普通だと思います。https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.htmlナイス0
###回答ありがとうございます。プライマリーキーがあるテーブルなんですが、innnodbを選択しているため、insert時にエラーが起きたらautoincrementの値が増えてしまいます。だからinsert前にチェックするようにしています。条件は、例えばユーザーIDの指定です。where user_id='aaa'といった感じで。updateしたいときは ON DUPLICATE KEY UPDATEを使うのが一般的なのですね。ありがとうございます。
###皆さん、ありがとうございました。###私は、update かけて更新対象が無かったら、insert でやりますね。人それぞれなのかな?rdbならプロシージャが使えるから、mysqlだけでも2段階実行でも出来ますよ。ナイス0
###> 王道的な方法はどういう方法なのでしょうか。INSERT INTO ~ WHERE NOT EXISTSでしょう。UPDATEならSELECT * FROM ~ FOR UPDATEしてからUPDTAE とかINSERTの場合は追加する行がないので行ロックは使えません。テーブルを排他ロックするとかトランザクション分離レベルをSERIALIZABLEすると同時実行性が極端に劣化します。INSERTについては制約違反が発生する可能性を織り込み済みで処理を組み立てる、または自動付番にするのが普通でしょう。AUTO_INCREMENTの項目について連番を期待するのはやめたほうがいいです。今は使っていないかもしれませんが外部キー違反などでもINSERTでエラーが発生する可能性があります。論理削除であってもしてしまうと「有効(生きている)レコードの何番目」かは取得できないので実質使えない場合のほうが多いです。ナイス0

 

TAG