1

我在 informix(版本 11.50.UC4)中有一个名为 NextRecordID 的表,其中只有一个名为 id 的列,它将只有一行。我想要做的是将此值复制到另一个表中。但是,如果此表不存在,不希望我的查询失败。就像是

if table NextRecordID exists
    then insert into sometable values ('NextRecordID', (select id from NextRecordID))
    else insert into sometable values ('NextRecordID', 1)
4

3 回答 3

1

我最终使用了下面的 SQL 查询。它不是 ANSI SQL,但适用于我正在使用的 informix 服务器。

insert into sometable values ('NextRecordID', 
    select case (select 1 from systables where tabname='nextrecordid')
    when 1 then (select nextid from nextrecordid) 
    else (select 1 from systables where tabname='systables') end 
    from systables where tabname='systables');

这里发生的事情是在insert查询中我通过使用查询获得要插入的值select。现在这个select查询很有趣。它使用caseInformix 的语句。我编写了一个select查询来检查表是否nextrecordid存在,systables如果存在则返回 1。如果此查询返回 1,我会在表nextrecordid中查询该值,否则我编写一个查询以返回默认值 1。这对我有用。

于 2009-07-20T06:59:27.017 回答
0

您应该可以通过检查systables表格来做到这一点。

于 2009-07-16T19:43:59.960 回答
0

感谢您提供服务器版本信息 - 它使您更容易回答您的问题。

您尚未指明您使用的是哪种语言。

但是,通常情况下,您设计一个程序以期望某个模式(存在某些表),然后如果这些表不存在则失败 - 最好是在控制之下。此外,不清楚是否会因为重复执行第二个 INSERT 语句而遇到问题。NextRecordID 表何时更新也不清楚 - 大概,一旦使用了该值,就必须更新它。

您应该查看 SERIAL (BIGSERIAL) 并查看它是否适合您。

您还应该查看 SEQUENCE 是否适合在此处使用 - 它看起来确实很可能适用。

正如 Adam Hughes 指出的那样,如果您想检查 NextRecordID 表是否存在于数据库中,您可以查看 systables 表。但请注意,您的搜索需要针对全小写名称 (nextrecordid)。

此外,MODE ANSI 数据库使生活复杂化——您必须担心表的所有者(因为在 MODE ANSI 数据库中可能有多个名为 nextrecordid 的表)。最有可能的是,您不必担心这一点 - 就像您可能不必担心表 "someone"."NextRecordID" 的分隔标识符(它与 someone.NextRecordID 不同的表)。

于 2009-07-16T20:53:01.770 回答