2009-07-16 6 views
1

私は、idというカラムが1つしかないinformix(バージョン11.50.UC4)のテーブルをNextRecordIDと呼びます。これは1行です。私がしたいことは、この値を別のテーブルにコピーすることです。しかし、このテーブルが存在しない場合、私のクエリが失敗しないようにしてください。何かのように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

ありがとうアダムヒューズ。それはgoogleを使用して見つけるのは簡単でした:-)私は、その情報を使用する方法があったかどうかを知ろうとしていました。私はこれが私の質問ではっきりしていないと思います。 – sriharsha

0

ありがとうございました。サーバーのバージョン情報を含めていただきありがとうございます。これにより、質問に簡単に答えることができます。

あなたは使用している言語を指定していません。

通常、特定のスキーマ(特定のテーブルが存在する)が必要であると予測し、そのテーブルが存在しない場合は、制御できないようにプログラムを設計します。また、2番目のINSERT文が繰り返し実行されるために問題が発生するかどうかは不明です。また、NextRecordIDテーブルが更新されたときには明らかになりません。おそらく、値が使用されたら、更新する必要があります。

SERIAL(BIGSERIAL)を見て、それがあなたにとって適切かどうかを確認する必要があります。

また、SEQUENCEがここで使用するのに適しているかどうかを調べる必要があります。

Adam Hughesが指摘するように、NextRecordIDテーブルがデータベースに存在するかどうかを確認するには、systablesテーブルを調べます。ただし、検索はすべて小文字のネーム(nextrecordid)にする必要があることに注意してください。

また、MODE ANSIデータベースは人生を複雑にします - (MODE ANSIデータベースにnextrecordidという複数のテーブルが存在する可能性があるため)テーブルの所有者について心配する必要があります。おそらく、あなたはそれを心配する必要はありません。テーブル "someone"の区切られた識別子について心配する必要がある以上のことはありません。 "NextRecordID"(someone.NextRecordIDとは異なるテーブルです)。

+0

informixで少し作業をしていますが、私はサーバのバージョンがどれほど重要かを知っています:-)言語、私はその仕事をする簡単なSQL文を考えていたので、特定の言語については言及しませんでした。詳細な返信をしてくれてありがとうと思っていなかったコーナーへの洞察もありがとう。私のケースでは、問題はデータベースがオープンではなく、アプリケーションでのみ使用されるのでシンプルですので、nextrecordidは1つだけです。私はシリアルとシーケンスを使用することができますが、私はそこにいくつかの遺産もテーブルを使用するのコントロールとシンプルさが好きです。私はsystablesとcase文を使ってこれを解決することを考えています。 – sriharsha

+0

言語が関連する理由は、プレーンSQLはIF文自体をサポートしていないからです。 SPL(ストアドプロシージャ言語)、I4GL、またはさまざまなクライアントAPI(ODBC、JDBC、ESQL/Cなど)で使用できます。 –

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'); 

は、私は価値がselectクエリを使用して挿入するために得るinsertクエリ内です。今はselectという質問が面白いです。それはcase Informixのステートメントを使用します。テーブルnextrecordidsystablesに存在するかどうかを確認するために、selectというクエリを作成し、存在する場合は1を返します。このクエリで1が返された場合は、テーブルnextrecordidにその値を照会します。そうでなければ、デフォルト値1を返すクエリを作成しました。

関連する問題