0

我有一个表,该表的列上放置了唯一约束。

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

约束没有明确命名。

我可以通过以下查询获得相关约束的名称:

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 和更高版本上运行。感谢您在这里的任何帮助。

4

3 回答 3

0

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

于 2013-10-25T00:32:29.920 回答
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语句并将其保存在文件中;第二个执行生成的文件。

于 2013-10-24T21:40:24.793 回答
0

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

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

于 2013-10-25T03:29:19.367 回答