我在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)
答案 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不同的表)。