お世話になります。PHPでMysQLを操作しているウェブアプリを作っています。
あるテーブルにインサートする際、まずはじめに行数を取得し、その後insertするという場面がるのですが、同時アクセスの際、行数を取得するときに同じ値を取得してしまうという場面に遭遇しました。
色々と調べたのですが、対処法が分からず、mysqlはinnoDBの場合、insert時には排他ロックするとのことなので、行数の取得とinsertを同時に行えば対処できるかな?との考えから対処法を見つける過程で、max+1 という処理があるのを知りました。
前置きが長くなりました。以下はテストで動かしているテーブルです。
CREATE TABLE `testB` ( `id` int(11) NOT NULL, `no` int(11) NOT NULL, `type` enum('venue','tel','live') NOT NULL, `paddle_no` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `testB` (`id`, `no`, `type`, `paddle_no`) VALUES (1, 1, 'tel', 400), (2, 1, 'tel', 401), (3, 2, 'live', 1000), (4, 1, 'tel', 402), (9, 2, 'tel', 400), (10, 1, 'live', 1000), (13, 1, 'live', 1001), (14, 1, 'tel', 403); ALTER TABLE `testB` ADD PRIMARY KEY (`id`); ALTER TABLE `testB` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15; COMMIT;
勉強がてらに用意したSQLがこちら
INSERT INTO testB (id, no, type, paddle_no) SELECT 0, 1, 'live', MAX(paddle_no) + 1 FROM `testB` WHERE no = 1 AND type = 'live' INSERT INTO testB (id, no, type, paddle_no) SELECT 0, 1, 'tel', MAX(paddle_no) + 1 FROM `testB` WHERE no = 1 AND type = 'tel'
ここで質問です。テーブルにtelやliveといったカラムがありますが、telの場合は400番から、liveの場合は1000番からとしており、where句で条件としているレコードがある分には、401,402,403と描いている値が追加されていきますが、where句にない場合はどんなSQLにしたらいいのでしょうか?
ない場合、telだったら400を、liveだったら1000を、代入していきたく思っております。
アドバイスのほど頂けたら幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。