反向SQL查询架构修改

时间:2011-08-23 10:08:47

标签: sql postgresql

我得到了一个以某种方式更改数据库架构的SQL查询。如何生成将反转给定查询的架构更改的SQL查询,以便执行原始查询和反向查询对架构没有影响

例如,给定

ALTER TABLE t ADD COLUMN a INTEGER

我会产生

ALTER TABLE t DROP COLUMN a

PS,我知道我可能会丢失一些数据,例如,如果我删除并创建一个列,那么数据就会丢失。我能承受这一点。

PS2,我假设我可以查看当前架构,找出丢弃的列/表是什么。

PS3,通用答案很好,但DB特定答案也可以。

3 个答案:

答案 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