データベース - SQL 基本構文 - INSERT

 
1. INSERT
2. INSERT ~ SELECT
3. あれば INSERT なければ UPDATE postgreSQL 9.5 以上

1. INSERT

 INSERT の基本形は

INSERT INTO
    テーブル名
    (カラム名1, カラム名2, カラム名3, ...)
VALUES
    (値1, 値2, 値3, ...);
 カラム名の列挙は、値をテーブルのカラム分書込めば省略可能ですが、プログラムに組み込んだりするとテーブルに NULL値の設定可能なカラムを追加した時などプログラム側の変更が必須になってきますので、省略しない方が賢明です。

2. INSERT ~ SELECT

 テーブルから取得した値を INSERT に設定する方法。取得元は同一テーブルでも別のテーブルでも可。

INSERT INTO
    テーブル名
    (カラム名1, カラム名2, カラム名3, ...)
SELECT
    取得カラム名1,
    取得カラム名2,
    取得カラム名3,
    ...
FROM
    取得元テーブル名
WHERE
    条件;
 取得カラム名の部分は、直接値を指定することも可能。  この SQL は Oracle・PostgreSQL・DB2 で動作確認済。

3. あれば INSERT なければ UPDATE postgreSQL 9.5 以上

 「PostgreSQLで「あればUPDATE、なければINSERT」のUPSERTをやってみる」に記載してあった記事です。  postgreSQL のドキュメントでは「INSERT」に記載があります。

INSERT INTO
	テーブル
	(カラム1, カラム2...)
VALUES
	(値1, 値2...)
ON CONFLICT
	(カラム1)
DO UPDATE
	SET
		カラム2 = 値2...;
 てな感じで思い通りのことができるようです。  おを、便利。  ただし、参考サイトにあるように、CONFLICT で比較するカラムはユニークでないととんでもないことになるかエラーになります。  まぁ、通常はプライマリキーで使うのでしょう。  ON CONFLICT に指定できるカラムが1つかないみたいなので、困ったなぁと思っていたら・・・。  「PostgreSQL 9.5の新機能CONFLICT(UPSERT)を使ってみた。 | DevelopersIO」を読むと、カラムを省略すると一意規約違反となる組み合わせを含む・・・ということのようです。  まだ試していません。