我得到了一个SQL查询,该查询以某种方式更改数据库模式。如何生成将逆转给定查询的模式更改的SQL查询,以便执行原始查询和反向查询将不会对模式产生任何影响。
例如,给定
ALTER TABLE t ADD COLUMN a INTEGER我会生产
ALTER TABLE t DROP COLUMN aPS,我知道我可能会丢失一些数据,例如,如果我删除并创建一个列,那里的数据就会丢失。我能承受得住。
PS2,我假设我可以查看当前的模式,找出删除的列/表是什么。
PS3,泛型答案很好,但是DB特定的答案也可以。
发布于 2011-08-25 10:01:23
没有现成的、内置的解决方案。您需要编写一些代码,可能需要编写很多代码。
有许多“模式差异”类型工具存在。你可能会把其中一个投入使用。例如,创建原始模式,创建副本,在副本上运行模式更改命令,然后运行反向模式diff,这将为您提供取消第一个命令的命令。取决于您的确切需求,您可以在某种程度上编写此脚本。但可能会很乱。
发布于 2011-08-25 01:07:30
在一般情况下,除非执行CREATE语句,否则不能(至少在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语句重写为规范形式。例如,您可以编写类似的东西。
CREATE TABLE wibble (
a INTEGER PRIMARY KEY,
...但是PostgreSQL会存储这样的东西。
CREATE TABLE wibble
(
a integer NOT NULL,
. . .
CONSTRAINT wibble_pkey PRIMARY KEY (a)
)发布于 2011-08-26 05:43:00
到目前为止,我最好的选择是应用更改,并在这两种模式上运行阿普迪夫。
https://stackoverflow.com/questions/7159384
复制相似问题