お疲れ様です。
お世話になります。
データベースにあるキーを基にSELECTを出して、該当レコードがあればそのレコードのIDを取得、
なければ、そのキーをINSERTして、INSERT_IDを取得する。
これをひとつのクエリでできないかと悩んでいます。
perlだとfind_or_createというメソッドがあるらしいのですが、
私はPHP書きです。
DBはMySQL5を使っています。
PHPも5xです。
ググってもあまりいい案はなく、ムリならムリと突きつけていただければ
2つのクエリでがんばります。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
>そのキーをINSERTして、INSERT_IDを取得
auto_incrementを使うということですか?
auto_increment指定列と、もう一つ別のユニークなキーがあり、そのキーで検索するということでしょうか?
#1の例のauto_increment版です。
1.テスト用表定義
create table t1
(c1 int primary key auto_increment,
c2 char(1),
c3 varchar(10));
create unique index t1ix1 on t1(c2);
2.テスト用初期データ
insert into t1(c1,c2) values(null,'a'),(null,'b');
3.ストアドプロシジャの定義
drop procedure if exists find_or_create; -- 存在したら削除
delimiter // -- 終端記号の変更
create procedure find_or_create
(in pKey char(1),
out pInsertID int,
out pRC int)
--
-- 存在したらキー値を返し、存在しなかったら追加
--
begin
set pRC=0,pInsertID=null;
-- 検索してみる
select c1
into pInsertID
from t1
where c2=pKey;
if pInsertID is null then
-- 存在しなかったら追加
insert into t1(c1,c2)
values(null,pKey);
-- LastInsertIDを取得
select last_insert_ID()
into pInsertID;
set pRC=4;
end if;
end;
//
delimiter ; -- 終端記号を元に戻す
4.テスト
call find_or_create('c',@InsertID,@rc);
select @InsertID,@rc;
call find_or_create('c',@InsertID,@rc);
select @InsertID,@rc;
call find_or_create('d',@InsertID,@rc);
select @InsertID,@rc;
call find_or_create('a',@InsertID,@rc);
select @InsertID,@rc;
ご丁寧な回答ありがとうございます。
ソースまで書いていただいて、頭の下がる思いです。
INSERT_IDはauto_incrementのつもりでした。
ストアドプロシージャは使ったことがないんですが、
これをきっかけに勉強してみます。
ありがとうございました。
No.1
- 回答日時:
find_or_createについて少し検索してみましたが、分かりやすい記事が見つけられませんでした。
MySQL5なら、ストアドプロシジャで類似機能を実装する方法もあります。
1.テスト用の表定義
create table t1
(c1 int primary key,
c2 int,
c3 varchar(10));
2.テスト用の初期データ
insert into t1(c1) values(1),(10);
3.ストアドプロシジャ登録
drop procedure if exists find_or_create; -- 存在したら削除
delimiter // -- 終端記号の変更
create procedure find_or_create
(in pInKey int,
out pOutKey int,
out pRC int)
--
-- 存在したらキー値を返し、存在しなかったら追加
--
begin
set pRC=0,pOutKey=null;
-- 検索してみる
select c1
into pOutKey
from t1
where c1=pInKey;
if pOutKey is null then
-- 存在しなかったら追加
insert into t1(c1)
values(pInkey);
-- 再検索してもいいが、変数間でコピー
set pOutKey=pInKey;
set pRC=4;
end if;
end;
//
delimiter ; -- 終端記号を元に戻す
4.ストアドプロシジャのテスト
call find_or_create(50,@key,@rc);
select @key,@rc;
※既に存在したら@rc=0、追加したら@rc=4、@keyにそのキー値が返ります。
#2のほうを実行してみました。
見事find_or_createできてました。
すごいです。自分にとっちゃ新発見でした。
感動しました。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- PHP php エラー 2 2022/10/23 16:43
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- Access(アクセス) アクセス IDが空白の時、メッセージボックスがでるようにするには 1 2022/08/04 11:06
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下記の問合せを行うクエリを、P...
-
SQLです。こんな感じですか?あ...
-
書籍の内容はまともでしょうか?
-
うまくいきません教えてくださ...
-
東京23区を、皇居を中心とした...
-
mysqlがインストールされている...
-
下記の問合せを行うクエリを、P...
-
テーブル名が可変の場合のクエ...
-
本を見ながらPHPを勉強している...
-
次の時間帯の勝率の合計を求め...
-
あっってますか?うまくいきま...
-
[1000地域 × 10カテゴリー = 1...
-
下記の問合せを行うクエリを、P...
-
下記の問合せを行うクエリを、P...
-
下記の問合せを行うクエリを、P...
-
データベースの複製の仕方(mysql)
-
【初歩】ラジオボタンをつかっ...
-
MySQL NULLだけをカウントして...
-
SQL任意に並び替えをしたい
-
my_itemsテーブルのIDにAUTO_IN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#1062 - '0' は索引 'PRIMARY' ...
-
テーブル名が可変の場合のクエ...
-
「最高気温が35度以上の日を猛...
-
SQLでカラムを追加し、条件に合...
-
mysqlのupdate構文についての質...
-
htmlコードで書かれた表にphpで...
-
php テーブルを作れない
-
SQLです。こんな感じですか?あ...
-
「第一回模試の3科目の各得点...
-
データベースの接続に失敗して...
-
select *, `人口(男)`AND`人口(...
-
次の時間帯の勝率の合計を求め...
-
下記の問合せを行うクエリを、P...
-
うまくいきません教えてくださ...
-
SQLです。下記の問合せを行うク...
-
エラー 1068 (42000): 複数の主...
-
東京23区を、皇居を中心とした...
-
MySQL NULLだけをカウントして...
-
データベースの複製の仕方(mysql)
-
MySQLのエラーメッセージ(エラ...
おすすめ情報