SQLite
SQLiteで既存データを更新する方法
はじめに
データベースにデータが一度入力されると、それがテーブルに存在する間ずっと静的なままであることはほとんどありません。データは、それが表すシステムの変更を反映するように更新され、関連性を保ち、最新の状態を維持します。SQLiteでは、UPDATE
SQLコマンドを使用してレコード内の値を変更できます。
UPDATE
は、INSERT
(列とその目的の値を指定する点で)およびDELETE
(特定のレコードを対象とするために必要な条件を提供する点で)と類似した機能を持ちます。また、データを個別に、または一括で変更することもできます。この記事では、すでにテーブルに保存されているデータを効果的に管理するためにUPDATE
をどのように使用するかについて詳しく説明します。
UPDATE
を使用したデータの変更
UPDATE
コマンドの基本的な構文は次のようになります。
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1;
基本的な構造は3つの異なる句で構成されます
- 操作対象のテーブルの指定
- 更新する列とその新しい値の提供
- SQLiteがどのレコードを一致させるかを判断するために評価する必要がある条件の定義
上記のように列に直接値を割り当てることもできますが、INSERT
コマンドでよく見られるように、列リストの構文を使用することもできます。
例えば、上記の例を次のように変更できます。
UPDATE my_tableSET (column1, column2) =(value1, value2)WHEREid = 1;
Prisma Clientでデータを更新するには、更新クエリを発行します。
UPDATE
コマンドによって変更されたレコードの返却
デフォルトでは、SQLiteはUPDATE
ステートメントによって影響を受けた行数を表示しません。しかし、SQLiteはバージョン3.35.0
でPostgreSQLをモデルにしたRETURNING
句を追加しました。この句により、コマンドは変更されたレコードのすべてまたは一部を返します。
アスタリスク*
記号を使用すると、SELECT
ステートメントと非常によく似た方法で、変更された行のすべての列を返すことができます。
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1RETURNING *;
さらに、AS
を使用して、エイリアスを使用するかどうかにかかわらず、表示したい正確な列を指定することもできます。
UPDATE my_tableSETcolumn1 = value1,column2 = value2WHEREid = 1RETURNING column1 AS 'first column';
別のテーブルの値に基づいてレコードを更新する
新しい外部データに基づいてデータを更新することは、比較的効率的なプロセスです。テーブル、列、新しい値、およびターゲットとなる条件を提供するだけで済みます。
しかし、SQLiteでは、データベース内の別のテーブルの情報に基づいて、UPDATE
を使用してテーブルの値を条件付きで更新することもできます。基本的な構文は次のようになります。
UPDATE table1SET table1.column1 =(SELECT table2.column1FROM table2WHERE table1.column2 = table2.column2);
ここでは、table1
のcolumn1
の値を、table2
に対するSELECT
サブクエリの戻り値に直接更新していますが、これはtable1
のcolumn2
がtable2
のcolumn2
と一致する行に限られます。FROM
句は2つのテーブル間の接続を示し、WHERE
は条件を指定します。
例として、book
とauthor
という2つのテーブルがあるとしましょう。
CREATE TABLE author (id INTEGER PRIMARY KEY,first_name TEXT,last_name TEXT,last_publication TEXT);CREATE TABLE book (id INTEGER PRIMARY KEY,author_id INT REFERENCES author.idtitle TEXT,publication_year INTEGER);INSERT INTO author (first_name, last_name)VALUES('Leo', 'Tolstoy'),('James', 'Joyce'),('Jean-Paul', 'Sarte');INSERT INTO book (author_id, title, publication_year)VALUES(1, 'Anna Karenina', '1877'),(1, 'War and Peace', '1867'),(2, 'Ulysses', '1920'),(2, 'Dubliners', '1914'),(3, 'Nausea', '1938');
これら2つのテーブルは、book.author_id
がauthor.id
を参照する関係を持っています。現在、author
テーブルのlast_publication
はNULL
です。FROM
句とWHERE
句を使用して両方のテーブルを結びつけ、book
テーブルにある著者の最新出版物でこれを埋めることができます。
ここで、last_publication
を更新する例を示します。
UPDATE authorSET last_publication=(SELECT titleFROM bookWHERE author_id = author.idORDER BY author_id, publication_year DESC);
ここでauthor
テーブルをクエリすると、データベース内の最新の出版物のタイトルが表示されます。
SELECT * FROM author;
+------------+------------+-----------+--------------------------+id first_name last_name last_publication+-------------+------------+-----------+--------------------------+1 Leo Tolstoy Anna Karenina2 James Joyce Ulysses3 Jean-Paul Sarte Nausea+-------------+------------+-----------+--------------------------+
まとめ
このガイドでは、UPDATE
コマンドを使用してテーブル内の既存データを変更する基本的な方法について説明しました。これらの基本的な概念を実行することで、テーブル内の既存の行を識別するために必要な正確な条件を指定し、列名を値で更新し、オプションでRETURNING
を使用して影響を受けた行を返すことができます。UPDATE
コマンドは、データベースへの初回挿入後のデータ管理に不可欠です。
よくある質問
SQLiteでは、UPDATE
ステートメントを使用してレコードを編集できます。
基本的な構文は次のようになります。
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1;
SQLiteでは、次のようなUPDATE
コマンドを使用できます。
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREcolor = 'blue';
この構文により、WHERE
条件に応じて一括更新を行うことができます。この場合、color
列が'blue'
であるすべてのレコードについて列が更新されます。
デフォルトでは、SQLiteはUPDATE
ステートメントによって影響を受けた行数を表示しません。
ただし、SQLiteには変更されたレコードのすべてまたは一部を返すRETURNING
句があります。
基本的な構文は、すべての列名を返すように指定する*
を使用した場合、次のようになります。
UPDATE my_tableSETcolumn1 = value1,column2 = value2,WHEREid = 1RETURNING *;
SQLiteには、他の多くのリレーショナルデータベースのようなIF EXISTS
句はありません。
データが存在する場合のINSERT
またはUPDATE
を制御するには、ステートメントにON CONFLICT
句を追加する必要があります。
SQLiteで結合を使用してUPDATE
を実行するには、UPDATE FROM
拡張を使用できます。このSQL拡張機能により、データベース内の他のテーブルによってUPDATE
ステートメントを駆動できます。
UPDATE-FROM
を使用すると、ターゲットテーブルをデータベース内の他のテーブルと結合することで、どの行を更新する必要があるか、およびそれらの行にどのような新しい値を設定すべきかを計算するのに役立ちます。