首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向SQL查询模式修改

反向SQL查询模式修改
EN

Stack Overflow用户
提问于 2011-08-23 10:08:47
回答 3查看 580关注 0票数 2

我得到了一个SQL查询,该查询以某种方式更改数据库模式。如何生成将逆转给定查询的模式更改的SQL查询,以便执行原始查询和反向查询将不会对模式产生任何影响。

例如,给定

代码语言:javascript
复制
ALTER TABLE t ADD COLUMN a INTEGER

我会生产

代码语言:javascript
复制
ALTER TABLE t DROP COLUMN a

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

PS2,我假设我可以查看当前的模式,找出删除的列/表是什么。

PS3,泛型答案很好,但是DB特定的答案也可以。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-25 10:01:23

没有现成的、内置的解决方案。您需要编写一些代码,可能需要编写很多代码。

有许多“模式差异”类型工具存在。你可能会把其中一个投入使用。例如,创建原始模式,创建副本,在副本上运行模式更改命令,然后运行反向模式diff,这将为您提供取消第一个命令的命令。取决于您的确切需求,您可以在某种程度上编写此脚本。但可能会很乱。

票数 0
EN

Stack Overflow用户

发布于 2011-08-25 01:07:30

在一般情况下,除非执行CREATE语句,否则不能(至少在PostgreSQL上)。例如,假设您从这个表开始。

代码语言:javascript
复制
CREATE TABLE wibble (
  a INTEGER,
  b INTEGER,
  c VARCHAR(35),
  d DATE
);

模式将按如下方式记录。

代码语言:javascript
复制
CREATE TABLE wibble
(
  a integer,
  b integer,
  c character varying(35),
  d date
)

然后删除列"a",并添加列"a“。

代码语言:javascript
复制
ALTER TABLE wibble DROP COLUMN a;
ALTER TABLE wibble ADD COLUMN a INTEGER;

现在模式将如下所示。

代码语言:javascript
复制
CREATE TABLE wibble
(
  b integer,
  c character varying(35),
  d date,
  a integer
)

"a“列是第一列,现在是最后一列了。这在关系理论或SQL中并不重要,因为列的顺序并不重要。不过,对于版本控制系统来说,这非常重要。

删除列还可能会删除约束、触发器和索引。

PostgreSQL还将将SQL语句重写为规范形式。例如,您可以编写类似的东西。

代码语言:javascript
复制
CREATE TABLE wibble (
    a INTEGER PRIMARY KEY,
...

但是PostgreSQL会存储这样的东西。

代码语言:javascript
复制
CREATE TABLE wibble
(
  a integer NOT NULL,
  . . .
  CONSTRAINT wibble_pkey PRIMARY KEY (a)
)
票数 2
EN

Stack Overflow用户

发布于 2011-08-26 05:43:00

到目前为止,我最好的选择是应用更改,并在这两种模式上运行阿普迪夫

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7159384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档