1

Informix (バージョン 11.50.UC4) には、id という名前の列が 1 つだけある NextRecordID という名前のテーブルがあり、1 つの行があります。私がしたいのは、この値を別のテーブルにコピーすることです。ただし、このテーブルが存在しない場合にクエリが失敗するのは望ましくありません。何かのようなもの

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が存在するかどうかを確認し、存在する場合はsystables1 を返すクエリを作成しました。このクエリが 1 を返す場合、テーブルnextrecordidに値をクエリするか、デフォルト値 1 を返すクエリを作成します。これは私にとってはうまくいきます。

于 2009-07-20T06:59:27.017 に答える
0

サーバーのバージョン情報を含めていただきありがとうございます。質問への回答が簡単になります。

使用している言語を指定していません。

ただし、通常は、特定のスキーマ(特定のテーブルが存在する)を期待するようにプログラムを設計し、それらのテーブルが存在しない場合は失敗します(できれば制御下にあります)。また、2番目の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 に答える