あるテーブルから別のテーブルに列を抽出し、挿入された行のIDを外部キーとして格納します(PostgreSQL)

SE:

現在のシステムでは、列(typeを含むテーブル(ExistingEntity)があります。

現在のテーブルリレーション

構造変化の一環として、この値は(新しいテーブル内の行に「抽出」する必要があるプロパティ)との外部キーとして新しい行のIDを格納ExistingEntity.propertiesProperties.idは自動インクリメントシーケンスです。

新しい関係構造

だから私がする必要があるのは:

  1. e.typeからExistingEntity e挿入Properties p
  2. 設定するe.propertiesにはp.id

これをクエリとして実行するにはどうすればよいですか?私たちのデータベースはPostgreSQL 9.6を使用しています

編集:私の説明は一部にとって少し曖昧すぎるようですので、私が達成したいことは2つのテーブルです

ExistingEntity
+------+------+
|  id  | type |
+------+------+
| 1735 | 4    |
| ...  | ...  |
+------+------+

Type
+-----+---------------------+
| id  |        data         |
+-----+---------------------+
| 4   | "imageSomeDataHere" |
| ... | ...                 |
+-----+---------------------+

3つのテーブルに抽出されます

ExistingEntity
+------+------------+
|  id  | properties |
+------+------------+
| 1735 | 1          |
| ...  | ...        |
+------+------------+

Properties
+-----+------+
| id  | type |
+-----+------+
| 1   | 4    |
| ... | ...  |
+-----+------+

Type
+-----+---------------------+
| id  |        data         |
+-----+---------------------+
| 4   | "imageSomeDataHere" |
| ... | ...                 |
+-----+---------------------+

私はクエリを考えました

UPDATE ExistingEntity e SET properties = (
  INSERT INTO Properties (type) VALUES (e.type) RETURNING id
);

動作しますが、IntelliJはその構文に関する文句を言っています

ルーベンヘルスロート:

ここにあなたの好意でトランザクションがあるという事実を使用して、ただ順番に実行してください。私は私の電話を使用しているため、DDLコードは正確に機能しない可能性がありますが、簡単に見つけることができます。

BEGIN TRANSACTION;

CREATE TABLE Properties...; -- id and type columns, and a temporary entity_id

-- Properties.Id should auto-increment
INSERT INTO Properties(entity_id, type)
SELECT id, type
FROM ExistingEntity;

-- Make property NULLABLE for now
ALTER TABLE ExistingEntity DROP COLUMN type;
ALTER TABLE ExistingEntity ADD COLUMN property NULL;

-- Connect ExistingEntity to Properties
UPDATE ExistingEntity
SET property = Properties.id
FROM Properties
WHERE Properties.entity_id = ExistingEntity.id;

-- Cleanup
ALTER TABLE Properties DROP COLUMN entity_id;
ALTER TABLE ExistingEntity ALTER COLUMN property NON NULL;

-- Finally, commit
COMMIT;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ