我有一个表格,其列上有一个唯一的约束。
现在我们发现我们需要消除这种不正确的约束。
没有明确命名约束。
我可以使用此查询获取相关约束的名称:
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及更高版本上运行。感谢您的帮助。
答案 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或等效的方式运行它。