将数据从 link table 迁移到目标 table
Migrate data from a link table into target table
我有两个 table。一个(我们称它为 a
)目前是一个 link table,数据如下
| c_id | t_id |
|-------|-------|
| 1 | 8 |
| 1 | 9 |
| 2 | 8 |
| 3 | 8 |
| 4 | 9 |
和另一个 (t
) 具有这样的数据
| id | code | value |
|-------|-------|-------|
| 1 | AB | 0.9 |
| 2 | BC | 0 |
| 3 | IM | 0 |
| 4 | MC | 0 |
| 5 | VI | 0 |
| 6 | BC | 0.9 |
| 7 | MC | 2.5 |
| 8 | VI | 2.5 |
| 9 | BC | 2.5 |
t_id
in table a
是映射到 table id
t
的外键,这是一个自动递增的 ID .
由于功能更改,我现在希望 a
中的数据复制 t
中的 linked 行并添加所需的 c_id
(然后 table a
被删除)所以你得到这样的东西;
| id | c_id | code | value |
|-------|-------|-------|-------|
...
| 25 | 1 | VI | 2.5 |
| 26 | 2 | VI | 2.5 |
| 27 | 3 | VI | 2.5 |
| 28 | 1 | BC | 2.5 |
| 29 | 4 | BC | 2.5 |
这将使我能够更改每个 c_id
的 value
列,而不是全局更改。新行可以安全地添加到 table 的末尾 - 或者在 table 中包含此信息可能会更好。
是否有可以执行此操作的查询?我希望我不必手工做!
假设我理解正确,因为你提到修改 tables,这是一个 one-time 过程。
您将无法将行添加到任何现有 table 的末尾,因为您有不同的列要求。您必须创建一个新的 table 或修改现有的。我选择了前者,然后您可以使用 CREATE TABLE ... SELECT ...
语法填充它:
CREATE TABLE new_t (id SERIAL, c_id INT, code VARCHAR(2), value FLOAT);
INSERT INTO new_t (c_id, code, value)
SELECT a.c_id, t.code, t.value FROM a INNER JOIN t ON (t.id = a.t_id);
我有两个 table。一个(我们称它为 a
)目前是一个 link table,数据如下
| c_id | t_id |
|-------|-------|
| 1 | 8 |
| 1 | 9 |
| 2 | 8 |
| 3 | 8 |
| 4 | 9 |
和另一个 (t
) 具有这样的数据
| id | code | value |
|-------|-------|-------|
| 1 | AB | 0.9 |
| 2 | BC | 0 |
| 3 | IM | 0 |
| 4 | MC | 0 |
| 5 | VI | 0 |
| 6 | BC | 0.9 |
| 7 | MC | 2.5 |
| 8 | VI | 2.5 |
| 9 | BC | 2.5 |
t_id
in table a
是映射到 table id
t
的外键,这是一个自动递增的 ID .
由于功能更改,我现在希望 a
中的数据复制 t
中的 linked 行并添加所需的 c_id
(然后 table a
被删除)所以你得到这样的东西;
| id | c_id | code | value |
|-------|-------|-------|-------|
...
| 25 | 1 | VI | 2.5 |
| 26 | 2 | VI | 2.5 |
| 27 | 3 | VI | 2.5 |
| 28 | 1 | BC | 2.5 |
| 29 | 4 | BC | 2.5 |
这将使我能够更改每个 c_id
的 value
列,而不是全局更改。新行可以安全地添加到 table 的末尾 - 或者在 table 中包含此信息可能会更好。
是否有可以执行此操作的查询?我希望我不必手工做!
假设我理解正确,因为你提到修改 tables,这是一个 one-time 过程。
您将无法将行添加到任何现有 table 的末尾,因为您有不同的列要求。您必须创建一个新的 table 或修改现有的。我选择了前者,然后您可以使用 CREATE TABLE ... SELECT ...
语法填充它:
CREATE TABLE new_t (id SERIAL, c_id INT, code VARCHAR(2), value FLOAT);
INSERT INTO new_t (c_id, code, value)
SELECT a.c_id, t.code, t.value FROM a INNER JOIN t ON (t.id = a.t_id);