【问题标题】:Add column automatically when the base table changes in PostgreSQLPostgreSQL 中基表更改时自动添加列
【发布时间】:2019-02-13 07:14:08
【问题描述】:

我正在使用 Postgres。

table1 列:idname

table2_hist 列:idname

如果我在table1 中再添加一列salary(只有该列,没有数据),是否可以将该列也添加到table2

像这样,我有多个表要添加列。有这个脚本吗?

【问题讨论】:

  • 这看起来像是一个糟糕的规范化数据模型。 table1 和 table2 实际上应该只是一个表,可能有一列标识它所属的“类型”。但是,表继承可能是解决此问题的一种方法,或者 - 如果您使用的是最新的 Postgres 版本 - 您可以为此使用 partitioning
  • Postgres 9.1 和 9.3 以及 no longer supported。您应该尽快计划升级到受支持的版本。
  • 我只需要这样
  • 为什么要添加 MySQL 标签?您真正使用的是哪个数据库?
  • 我想要在服务器 mysql 和 postgres 中。

标签: python mysql postgresql postgresql-9.1 postgresql-9.3


【解决方案1】:

在 PostgreSQL 中,一种方法是使用由ALTER TABLE 触发的event trigger。在用 C 编写的事件触发器中,您可以分析解析树并采取适当的措施。

但这似乎是一个繁琐的方法。

PostgreSQL 中的另一个想法是使用继承。由于表具有相同的列,因此可以从另一个继承:

CREATE TABLE table1 (id integer PRIMARY KEY, name text);

CREATE TABLE table2 () INHERITS (table1);

\d table2
              Table "laurenz.table2"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           | not null | 
 name   | text    |           |          | 
Inherits: table1

ALTER TABLE table1 ADD newcol bytea;

\d table2
              Table "laurenz.table2"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           | not null | 
 name   | text    |           |          | 
 newcol | bytea   |           |          | 
Inherits: table1

但我认为您找不到适用于 MySQL 和 PostgreSQL 的解决方案。

我认为尝试在数据库中自动执行此操作是错误的。您应该找到其他方法来确保在没有相应修改历史表的情况下不会修改任何表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 2019-12-06
    • 2020-09-05
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多