現在のシステムでは、列(type)を含むテーブル(ExistingEntity)があります。
構造変化の一環として、この値は(新しいテーブル内の行に「抽出」する必要があるプロパティ)との外部キーとして新しい行のIDを格納ExistingEntity.properties。Properties.idは自動インクリメントシーケンスです。
だから私がする必要があるのは:
e.type
からExistingEntity e
に挿入Properties p
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]
コメントを追加