在Informix上,如何以编程方式删除名称未知的唯一约束?

时间:2013-10-24 21:07:08

标签: sql informix

我有一个表格,其列上有一个唯一的约束。

现在我们发现我们需要消除这种不正确的约束。

没有明确命名约束。

我可以使用此查询获取相关约束的名称:

SELECT
s.constrname
  FROM informix.sysconstraints s
 INNER JOIN informix.systables t ON t.tabid = s.tabid
 INNER JOIN informix.syscolumns c ON c.tabid = t.tabid
 WHERE t.tabname = 'the_table'
   AND c.colname = 'the_column'
   AND s.constrtype = 'U'

现在我需要动态地将此约束名称提供给DROP CONSTRAINT语句。

我想我可以使用变量和连接运算符创建一个存储过程,然后运行它,然后将其删除。当然有一种更快,更便宜,单次拍摄的方式吗? EXECUTE IMMEDIATE或类似的东西 - 虽然我从阅读其文档中承认,我不明白这种说法在这方面是如何帮助我的。

这必须在Informix 11.5及更高版本上运行。感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

我觉得这样的事情应该有效:

echo 'unload to t.sql delimiter " " select "alter", "table", t.tabname, "drop", \
"constraint", s.constrname from informix.sysconstraints s inner join <...etc>' \
dbaccess yourdatabasename; cat t.sql | dbaccess yourdatabasename

显然,将您的其余查询代替<...etc>。整个事情应该在一条线上 - 我把反斜杠放在我拆分的地方以便于阅读。

第一个命令生成ALTER TABLE语句并将其保存在文件中;第二个执行生成的文件。

答案 1 :(得分:0)

知道你,你可能有Java ......为什么你不能使用它?您需要动态提供table_name和column_name吗?或者这总是适用于同一个表/列? 如果这些改变了,你已经有了一些动态数据...那么为什么不用任何语言构造语句然后执行呢? 但是,是的,“语言”可能是SPL ... IDS 11.50支持SPL中的EXECUTE IMMEDIATE。 我可能会遗漏一些东西,但通常SQL不允许通过“嵌入”查询来动态获取语句的一部分。你知道任何这样做的DB吗? 问候。

答案 2 :(得分:0)

您在查询中找到的约束名称可能以空格(空格)开头。为了能够按名称删除约束,您需要生成一个包含双引号内的名称的SQL语句,并且需要运行带有DELIMIDENT环境集的SQL语句(其值实际上无关紧要,但选择1表示简单)。

11.50是否在SPL中包含动态SQL?我认为这是一个11.70功能。如果它可用,那么显然你将使用它。如果没有,您将必须创建SQL并通过DB-Access或等效的方式运行它。