我们有几个列的命名模式(如id
/key
或created
/ creation_date
/ create_date
)并希望统一它。
我们也想以向后兼容的方式来做。我们希望能够同时运行旧代码和新代码,直到我们摆脱旧代码,所以如下:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
是一个突破性的变化。
列是否有某种形式的别名,例如表的视图(对于 Postgresql)?
回答@CL(tnx 提示!)https://www.postgresql.org/docs/12/ddl-generated-columns.html
无法直接写入生成的列。在 INSERT 或 UPDATE 命令中,不能为生成的列指定值,但可以指定关键字 DEFAULT。
因此,如果一个想法是在您更新所有报告脚本之前保留列 - 这很好。但是,如果您想回滚到以前的应用程序版本-您不走运((
目前我们在 Google Postgres Cloud 上提供:https ://cloud.google.com/sql/docs/postgres/db-versions并且 v12 仅处于测试阶段。
没有简单的方法可以做到这一点,但我能想到的唯一方法是使用一层视图来保留旧名称。
创建两个模式,例如“旧”和“新”或类似的东西。
“新”模式包含具有新列(可能还有表)名称的真实表。让可以处理的应用程序将search_path设置为仅新模式。
对于每个已重命名列的表(或者如果表本身已重命名),请在“旧”模式中使用旧名称创建一个视图,例如
此视图将自动更新,无需为其编写触发器。
使只能处理旧名称的应用程序将其 search_path 设置为
old, new
. 然后,一个不合格的引用table_name
将使用old.table_name
带有代码预期列的视图。由于视图是可更新的,这同样适用于 DML。显然,如果应用程序代码出于某种原因检查真实表的存在,这将不起作用。或者尝试检测这些表的约束。
它还要求您可以在连接数据库时更改搜索路径(例如,使用 JDBC 时,您可以通过在连接 URL 中传递它来实现)