informix检查表是否存在然后读取值

时间:2009-07-16 19:01:28

标签: sql informix

我在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)

3 个答案:

答案 0 :(得分: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查询很有趣。它使用Informix的case语句。我编写了一个select查询来检查nextrecordid中是否存在表systables,如果存在则返回1。如果此查询返回1,则查询表nextrecordid以获取值,否则我编写了一个查询以返回默认值1.这对我来说很有用。

答案 1 :(得分:0)

您应该可以通过查看systables表格来完成此操作。

答案 2 :(得分:0)

感谢您提供服务器版本信息 - 这样可以更轻松地回答您的问题。

您没有说明您使用的是哪种语言。

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

你应该看一下SERIAL(BIGSERIAL)并看看它是否适合你。

你还应该看一下SEQUENCE是否适合在这里使用 - 它看起来很像它可能适用。

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

此外,MODE ANSI数据库使生命变得复杂 - 您必须担心表的所有者(因为在MODE ANSI数据库中可能存在多个名为nextrecordid的表)。最有可能的是,您不必担心这一点 - 除了您可能不得不担心表“someone”的分隔标识符。“NextRecordID”(这是与someone.NextRecordID不同的表)。