mysql 値が無いときだけinsertしたい(insert - not exists)

ユニーク値の設定だったり、存在しないときだけinsertしたい

作成日:2023-04-26, 更新日:2023-06-15

メモ

…どう説明すれば良いのか分からないので…テーブルの設定例とクエリとコメントをメモしておく

テーブルの設定例

  • 「テーブル名: tbl_zebra」
  • 「user_id, user_name」をユニークキーに設定

クエリ

insert into `tbl_zebra` (
	user_id,
	user_name,
	created_at,
	updated_at
) 
select
	14,
	'丸ごとシマウマ',
	1682493331,
	1682493331 
from `tbl_zebra`
where not exists (
	select 1 
	from `tbl_zebra` 
	where 1 
		and user_id = 14 
		and user_name = '丸ごとシマウマ'
)
limit 1;

クエリのメモ

上記のクエリと同じだけど、コメントを色々と追加

insert into `tbl_zebra` (
	user_id,
	user_name,
	created_at,
	updated_at
) 
# ▼以下が存在しないときだけ表示させるクエリ
select
	14,
	'丸ごとシマウマ',
	1682493331,
	1682493331 
from `tbl_zebra` # ←参照しないからココのテーブル名は(insertするテーブル以外で存在するテーブルなら)何でもOK(※A)
where not exists (
	# ▼存在しているか確認したいデータ
	select 1 # ←「not exists()」のフラグ用なので何でもいい。
	from `tbl_zebra` 
	where 1 
		and user_id = 14 
		and user_name = '丸ごとシマウマ'
)
limit 1; # ←コイツがないと同じデータがいっぱいでてくる。「※A」で指定したテーブルのレコード数分?

メモ

▼チートシート代わり

insert into 対象テーブル ( カラムたち )
select 保存データ
from 「対象テーブル以外で存在する適当なテーブル」
where not exits ( select 1 from 対象テーブル where 条件 )
limit 1
;

※バルクインサートもいけそうな気がする

関連項目