MySQL エラー 1093: FROM 句で更新のターゲット テーブルを指定できません

2024-04-02

SQL エラー 1093: FROM 句で更新のターゲット テーブルを指定できません

このエラーは、MySQL で UPDATE 文を実行時に発生します。原因は、FROM 句で指定されたテーブルと同じテーブルをUPDATE 対象としている場合です。

原因:

MySQL は、UPDATE 文で FROM 句で指定されたテーブルを直接更新することはできません。これは、更新処理中にデータの整合性が失われる可能性があるためです。

解決策:

このエラーを解決するには、以下のいずれかの方法を試してください。

  1. JOIN を使用して更新する:
UPDATE テーブル1
JOIN テーブル2 ON テーブル1.ID = テーブル2.ID
SET テーブル1.列名 = 新しい値
WHERE テーブル2.条件;
  1. サブクエリを使用する:
UPDATE テーブル1
SET 列名 = (
    SELECT 新しい値
    FROM テーブル2
    WHERE テーブル2.条件
);
  1. 一時テーブルを使用する:
-- 一時テーブルを作成
CREATE TEMPORARY TABLE tmp_table (
    ID INT,
    列名 VARCHAR(255)
);

-- 一時テーブルにデータを挿入
INSERT INTO tmp_table (ID, 列名)
SELECT ID, 列名
FROM テーブル1;

-- 一時テーブルを更新
UPDATE tmp_table
SET 列名 = 新しい値;

-- 更新結果を元のテーブルに反映
UPDATE テーブル1
SET 列名 = tmp_table.列名
FROM tmp_table
WHERE テーブル1.ID = tmp_table.ID;

-- 一時テーブルを削除
DROP TEMPORARY TABLE tmp_table;

補足:

  • このエラーは、他のデータベースシステムでも発生する可能性があります。
  • 上記の解決策は、使用しているデータベースシステムによって異なる場合があります。
  • より詳細な情報は、MySQL の公式ドキュメントを参照してください。



例 1: エラー 1093 を発生させるコード

-- テーブル users を作成
CREATE TABLE users (
    ID INT,
    名前 VARCHAR(255)
);

-- テーブル users にデータ挿入
INSERT INTO users (ID, 名前) VALUES (1, 'John Doe');

-- エラー 1093 を発生させる UPDATE 文
UPDATE users
SET 名前 = 'Jane Doe'
FROM users;

このコードを実行すると、以下のエラーが発生します。

ERROR 1093 (HY000): You can't specify target table 'users' for update in FROM clause
-- テーブル users と addresses を結合
UPDATE users
JOIN addresses ON users.ID = addresses.user_id
SET users.名前 = 'Jane Doe'
WHERE addresses.city = 'Tokyo';

このコードは、テーブル users と addresses を結合し、結合条件に合致する users レコードの名前を更新します。

例 3: サブクエリを使用する

-- 新しい名前を取得するサブクエリ
SELECT CONCAT('Ms. ', 名前) AS 新しい名前
FROM users
WHERE ID = 1;

-- サブクエリを使用して users テーブルを更新
UPDATE users
SET 名前 = (
    SELECT 新しい名前
    FROM users
    WHERE ID = 1
);

このコードは、サブクエリを使用して新しい名前を取得し、その名前を users テーブルの ID 1 のレコードに更新します。

-- 一時テーブルを作成
CREATE TEMPORARY TABLE tmp_table (
    ID INT,
    名前 VARCHAR(255)
);

-- 一時テーブルにデータを挿入
INSERT INTO tmp_table (ID, 名前)
SELECT ID, 名前
FROM users;

-- 一時テーブルを更新
UPDATE tmp_table
SET 名前 = 'Jane Doe';

-- 更新結果を元のテーブルに反映
UPDATE users
SET 名前 = tmp_table.名前
FROM tmp_table
WHERE users.ID = tmp_table.ID;

-- 一時テーブルを削除
DROP TEMPORARY TABLE tmp_table;

このコードは、一時テーブルを使用して users テーブルのデータを更新します。




UPDATE 文の WHERE 句で条件を指定する:

UPDATE users
SET 名前 = 'Jane Doe'
WHERE ID = 1;

このコードは、ID が 1 の users レコードのみを更新します。

ALIAS を使用する:

UPDATE users AS u
SET u.名前 = 'Jane Doe'
WHERE u.ID = 1;

このコードは、users テーブルに ALIAS u を割り当て、ALIAS を使用して UPDATE 文を実行します。

TRIGGER を使用する:

CREATE TRIGGER update_user_name
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
    SET NEW.名前 = CONCAT('Ms. ', NEW.名前);
END;

このコードは、users テーブルのレコードが更新される前に TRIGGER を実行し、名前の前に "Ms. " を追加します。

  • 更新するレコードが少数であれば、WHERE 句で条件を指定するのが最も簡単です。
  • 更新するレコードが多かったり、複雑な条件を指定する場合は、JOIN やサブクエリを使用する方が効率的です。
  • データの整合性を保ちたい場合は、TRIGGER を使用するのがおすすめです。

sql mysql mysql-error-1093


ログインログからユーザーアクティビティを可視化:SQLによる連続アクセス日数分析

このチュートリアルでは、SQL Serverを使用して、ログデータなどの連続アクセス日数の最小値を計算する方法を説明します。この方法は、顧客のエンゲージメント分析、ログインアクティビティの監視、サブスクリプションの継続率追跡などに役立ちます。...


MySQL サーバーに接続できない!? エラーメッセージ "Host 'xxx.xx.xxx.xxx' is not allowed to connect to this MySQL server" の原因と解決方法

このエラーメッセージが表示される原因は、主に以下の2つです。接続元のホストが、MySQL サーバーのアクセス許可リストに登録されていないMySQL サーバーの設定が、外部からの接続を許可していないこのエラーメッセージを解決するには、以下の方法を試してください。...


更新された列だけをトリガー:SQL Serverでスマートなデータ操作を実現

SQL Server では、トリガーと呼ばれる仕組みを使って、データベースに対する操作に応じて自動的に処理を実行することができます。トリガーには様々な種類がありますが、中でも UPDATE トリガー は、テーブル内のデータが更新された際に実行されるものです。...


コマンド1つで解決!MySQL/MariaDBテーブルのDEFINERを確認する方法

INFORMATION_SCHEMA テーブルを使用するMySQL 5.0.15 以降では、INFORMATION_SCHEMA. TABLES テーブルを使用して、テーブルの定義者を確認することができます。SHOW CREATE TABLE ステートメントを使用して、テーブルの作成定義を取得することができます。この定義には、定義者に関する情報も含まれています。...


MariaDB で複数のデータベースに分散されたデータにアクセスする方法

MariaDB では、異なるデータベースにあるテーブルを共通の列の値に基づいて結合することができます。これは、複数のデータベースに分散されたデータにアクセスして分析する場合に役立ちます。手順データベースへの接続まず、それぞれのデータベースに接続する必要があります。以下のコマンドを使用して、データベース db1 と db2 に接続できます。...


SQL SQL SQL Amazon で見る



MySQL エラー 1093: FROM 句で更新対象テーブルを指定できない - 原因と解決方法

MySQL で UPDATE クエリを実行時に、FROM 句で指定したテーブルを更新しようとすると、エラー 1093 "Can't specify target table for update in FROM clause" が発生します。これは、サブクエリを使用するなど、いくつかの状況で起こり得ます。