【PostgreSQL】 SQL構文(DML):UPDATE文

PostgreSQL SQL構文(DML):UPDATE文

UPDATE 文は、テーブルのレコードを更新するSQL文です。


UPDATE文の基本構文

UPDATE table_name
SET column1 = value1,
    column2 = value2,
    ...
WHERE condition;


UPDATE

レコードを更新するテーブル名を指定します。


SET

更新する列と新しい値を指定します。複数の列を更新する場合は、カンマで区切ります。


WHERE

更新対象の行を絞り込むための条件を指定します。指定しない場合は、全ての行が更新されます。
下のSQL文は、WHERE で「department = ‘Sales’」と一致するレコードの「salary」の値を1.1倍に更新しています。WHERE句を省略すると、テーブル内のすべてのレコードが更新されてしまうので注意して下さい。

UPDATE employees
SET salary = salary * 1.1
WHERE department = 'Sales';


FROM

FROM 句で他のテーブルやサブクエリを指定すると、他のテーブルの値を使用して値を更新する事ができます。下のSQL文は、FROM 句で「bonuses」テーブルを指定して、「employees」テーブルの「給与」に「bonuses」テーブルの「ボーナス」を加算しています。

UPDATE employees
SET salary = salary + bonuses.amount
FROM bonuses
WHERE employees.id = bonuses.employee_id;


サブクエリを使った更新

SET 句の中でサブクエリを使用して、動的な値を設定することも可能です。下の例はエンジニアリング部門のすべての従業員の給料を、全従業員の平均給料に更新しています。

UPDATE employees
SET salary = (SELECT AVG(salary) FROM employees)
WHERE department = 'Engineering';


ONLY

UPDATE 文でパーティショニングテーブルの親テーブルに対して操作を行う場合、ONLY キーワードを使って親テーブルの行のみを更新し、子テーブルの行を除外することができます。
下の例では、親テーブルを「sales」子テーブルを「sales_2023」としてパーティショニングしています。

CREATE TABLE sales (
    id serial,
    sale_date date,
    amount numeric,
    department
) PARTITION BY RANGE (sale_date);

CREATE TABLE sales_2023 PARTITION OF sales
FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');

下のSQLを実行すると、親テーブル「sales」だけが更新されます。

UPDATE ONLY sales
SET amount = amount * 2
WHERE department = 'HR';


RETURNING

UPDATE 文の後に RETURNING 句を使うことで、更新されたレコードの特定の列の値を取得することができます。更新後のデータを確認するのに役立ちます。下の例では、更新された従業員の ID と新しい給料を返します。

UPDATE employees
SET salary = salary * 1.05
WHERE department = 'HR'
RETURNING id, salary;


RETURNING id, salary の取得方法「Pythonの場合」

INSERT文を実行した後、cur.fetchone()メソッドで取得します。

import psycopg2

# PostgreSQL に接続するための情報を設定
conn = psycopg2.connect(
    host="localhost",  # データベースのホスト
    database="your_database",  # データベース名
    user="your_username",  # ユーザー名
    password="your_password"  # パスワード
)

# カーソルを作成
cur = conn.cursor()

# UPDATE クエリを実行して、RETURNING で結果を取得
query = """
    UPDATE employees
    SET salary = salary * 1.05
    WHERE department = 'HR'
    RETURNING id, salary;
"""

# クエリの実行
cur.execute(query)

# クエリの結果を取得
rows = cur.fetchall()

# 結果を表示
for row in rows:
    employee_id = row[0]
    updated_salary = row[1]
    print(f"ID: {employee_id}, Updated Salary: {updated_salary}")

# トランザクションをコミット
conn.commit()

# カーソルと接続を閉じる
cur.close()
conn.close()

  • データベース接続psycopg2.connect() でデータベースに接続します。
  • カーソル作成conn.cursor() でデータベース操作を行うカーソルを作成します。
  • クエリ作成:UPDATE 文に RETURNING id, salaryを含めます。これにより、更新されたレコードの 「id」 と、「salary」を返します。
  • クエリ実行cur.execute(query) でクエリを実行します。
  • id と salary の取得:rows = cur.fetchall()でクエリの実行結果を取得し、「for row in rows:」で、
    id と salary を取得します。
  • コミットconn.commit() でトランザクションを確定します。
  • 接続終了:最後にカーソルとデータベース接続を閉じます。


UPDATE文のまとめ

  • レコードの値を更新するSQL文である。
  • FROM 句:他のテーブルの値を使用して値を更新できる。
  • RETURNING句:更新されたレコードの値を取得する事ができる。
  • ONLY句: パーティションニングされたテーブルの場合、親テーブルや子テーブルだけを更新できる。

タイトルとURLをコピーしました