結合テストを行うために検証用のDBにデータを登録した。
使用DBはoracle。触ったのは初めてだったので調べながらsqlを書いた。
アプローチを誤って?時間がかかってしまったので備忘録として残す。
<結論>
・データの穴埋めを行うにはinsertにnot existを組み合わせる。
またinsert intoの後に行うselectには固定値を入力する。
<前提条件>
・IDを1~9999全て抜けが無い状態でDBに登録する必要がある(PKで重複不可)
・他のカラムは固定値を登録する(任意の値でOK)
・本番環境からマスクデータ化して検証環境に移したデータがあるため、虫食い状態となっている。
(例えば1、2、4、5、6のように)
・既に入っているデータを消すのはNG
<最初考えたこと>
insertで1~9999全部埋めよう
→PKの重複チェックでsql実行不可。さて困った…
<誤ったアプローチ>
cursor fetchで1行ずつ存在するデータを取得して、存在していたらinsertしない
→取得まではできた。この後どうやって条件分岐を書こう・・・?
普通にロジック組めそうだけど上手く書けない悔しい
<上手くいったアプローチ>
ロジックは下記
①9999回ループを行う。オラクルではFOR i IN 1..9999 LOOP。
②DBにiの値がIDとして存在しない場合、insertを行う。
→insert intoにselectとnot existを組み合わせて行う。
組み合わせるとこんなsqlになった。
FOR i IN 1..9999 LOOP
insert into DB名 カラム1, カラム2
select i,'hoge'from dual
where not exists (select カラム1 from DB名 where カラム1 = i);
END LOOP;
→無事に1~9999が連番で存在するDBを作成することができました。
書き終わってみるととても単純な内容ですが、考えているときはすんなりと浮かばなかった。
selectで固定値を取得できることや、その内容をinsertすると便利なことを今回知ることができました:)
<参考にしたサイト様>
・オラクルでループどう書くか
https://www.shift-the-oracle.com/plsql/for-while-loop.html
・存在しない判定をどうやるか
https://oreno-it.info/archives/2401
・固定値を入れる方法
https://qiita.com/kazuhei/items/60d8366b53e6ca8ef28a
初めて書いたので、不適切な内容等ございましたら申し訳ございません。
ご指摘いただけた場合、随時確認させていただきます。