2009-07-16 57 views
1

我在名爲NextRecordID的informix(版本11.50.UC4)中有一個表,只有一列叫做id,它有一行。我想要做的是將此值複製到另一個表中。但是如果這個表不存在,不希望我的查詢失敗。類似於informix檢查表是否存在,然後讀取值

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

回答

0

您應該可以通過檢查systables表來執行此操作。

+0

感謝Adam Hughes。這很容易找到使用谷歌:-)我試圖找出是否有一種方法來使用該信息,並在純SQL語句中創建一個如果其他類型的結構。我想這個問題不是很清楚。 – sriharsha 2009-07-18 17:10:27

0

感謝您提供服務器版本信息 - 它使您更容易回答問題。

您尚未顯示您使用的是哪種語言。

但是,通常情況下,您會設計一個程序以期望某個模式(某些表存在),然後失敗 - 優選在控制下 - 如果這些表不存在。另外,由於重複執行第二個INSERT語句,您是否會陷入困境尚不清楚。 NextRecordID表的更新時間也不明確 - 大概一旦使用了該值,就必須更新它。

你應該看看SERIAL(BIGSERIAL),看看它是否適合你。

你還應該看看一個SEQUENCE是否適合在這裏使用 - 它看起來相當可能適用。

正如Adam Hughes所指出的,如果您想檢查數據庫中是否存在NextRecordID表,您可以查看systables表。但請注意,您的搜索將需要反對所有小寫名稱(nextrecordid)。另外,MODE ANSI數據庫使生活變得複雜 - 您不得不擔心表的所有者(因爲在MODE ANSI數據庫中可能有多個名爲nextrecordid的表)。最有可能的是,您不必擔心這一點 - 不僅僅是您可能不必擔心表「someone」的分隔標識符。「NextRecordID」(與someone.NextRecordID不同)。

+0

有一點與informix工作了一點,我知道服務器版本是多麼重要:-)語言,我想到一個簡單的SQL語句做這項工作,所以我沒有說任何特定的語言。感謝您的詳細回覆,以及對我未曾想到的某些角落的洞察。在我的情況下,這個問題很簡單,因爲數據庫沒有打開,它只用於我們的應用程序,所以只有一個nextrecordid。我可以使用序列和序列,但我喜歡使用表格的控制和簡單性,也有一些遺留在那裏。我正在考慮使用systables和case語句來解決這個問題。 – sriharsha 2009-07-18 17:20:09

+0

語言相關的原因是普通SQL本身不支持IF語句。它以SPL(存儲過程語言)或I4GL或各種客戶端API(ODBC,JDBC,ESQL/C等)提供。 – 2009-07-19 00:39:28

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.這對我有用。

相關問題