我得到了一个以某种方式更改数据库架构的SQL查询。如何生成将反转给定查询的架构更改的SQL查询,以便执行原始查询和反向查询对架构没有影响。
例如,给定
ALTER TABLE t ADD COLUMN a INTEGER
我会产生
ALTER TABLE t DROP COLUMN a
PS,我知道我可能会丢失一些数据,例如,如果我删除并创建一个列,那么数据就会丢失。我能承受这一点。
PS2,我假设我可以查看当前架构,找出丢弃的列/表是什么。
PS3,通用答案很好,但DB特定答案也可以。
答案 0 :(得分:2)
在一般情况下,除非执行CREATE TABLE语句,否则不能(至少在PostgreSQL上)。例如,假设您从这个表开始。
CREATE TABLE wibble (
a INTEGER,
b INTEGER,
c VARCHAR(35),
d DATE
);
架构将被记录为这样。
CREATE TABLE wibble
(
a integer,
b integer,
c character varying(35),
d date
)
然后删除列“a”,并添加“a”列。
ALTER TABLE wibble DROP COLUMN a;
ALTER TABLE wibble ADD COLUMN a INTEGER;
现在架构看起来像这样。
CREATE TABLE wibble
(
b integer,
c character varying(35),
d date,
a integer
)
列“a”是的第一列;现在是最后一次了。这在关系理论或SQL中并不重要,因为列的顺序无关紧要。然而,对于版本控制系统来说,这很重要。
删除列也可能会丢弃约束,触发器和索引。
PostgreSQL还会将您的SQL DDL语句重写为规范形式。例如,你可能会写这样的东西。
CREATE TABLE wibble (
a INTEGER PRIMARY KEY,
...
但是PostgreSQL会存储类似的内容。
CREATE TABLE wibble
(
a integer NOT NULL,
. . .
CONSTRAINT wibble_pkey PRIMARY KEY (a)
)
答案 1 :(得分:0)
没有现成的内置解决方案。你将不得不写一些代码,可能很多。
有很多“架构差异”类型的工具。您可以将其中一个投入使用。例如,创建原始模式,制作副本,在副本上运行模式更改命令,然后运行反向模式diff,它应该为您提供撤消第一个命令的命令。根据您的具体要求,您可以在某种程度上编写脚本。但它可能会很混乱。
答案 2 :(得分:0)
到目前为止,我最好的选择是应用更改,并在两个模式上运行apgdiff。