2016-05-26 4 views
0

新しいレコードをテーブルに挿入するために、テーブルの総レコード数を得ることができる関数が存在するのでしょうか?テーブルに合計レコードを含むフィールドを持つ新しいレコードを挿入します。

私はこのテーブルを持っている:

CREATE TABLE "TEST" 
    ( "NAME" VARCHAR2(20 BYTE), 
    "ID" NUMBER, 
    "FLAG" NUMBER 
    ) ; 
Insert into TEST (NAME,ID,FLAG) values ('Ahlahslfh',1,1); 
Insert into TEST (NAME,ID, FLAG) values ('Buoiuop',2,1); 
Insert into TEST (NAME,ID, FLAG) values ('UOIP',12,0); 

enter image description here

私の意図がこれに相当します文を発行することです:私は、生成されたエラーの下に使用

INSERT INTO TEST( NAME, ID, FLAG) 
    VALUES('TST', 3,1); 

声明:

INSERT INTO TEST ( NAME, ID, FLAG) 
    VALUES ('TST', SELECT COUNT(*)+1 FROM TEST WHERE FLAG=1,1); 
以下は

最終的な結果である私が期待しています:

enter image description here

はそれを回避する方法はありますか?もちろん、それらをスクリプトに入れ、レコードを変数に数え、その変数をフィールドに挿入することができます。私はちょうどよりエレガントな解決策があるかどうか疑問に思って、これを1つのステートメントで行います

ありがとうございます!

+2

このようにしないでください...計算された値をそのように保存するのは本当に悪い考えです。代わりに、表データとその余分な行を戻すビューを作成します。 – jarlh

+0

合意。 DisplayOrderというフィールドをIDではないはずです。私がイラストレーションの目的でテーブルを模擬していたときに、私の心にIDが入ってきたことは確かです。 – user1205746

答えて

3

これは、idを設定する非常に悪い方法です。一般的には、シーケンス/ identity/auto_incrementを使用し、ギャップについて心配する必要はありません。

しかし、あなたは括弧を使用してやりたいことができます - これらは、サブクエリのために必要とされる:

INSERT INTO TEST(NAME, ID, FLAG) 
    VALUES ('TST', 
      (SELECT COUNT(*)+1 FROM TEST WHERE FLAG = 1), 
      1 
      ); 

または、代わりに:

INSERT INTO TEST(NAME, ID, FLAG) 
    SELECT 'TST', COUNT(*) + 1, 1 
    FROM TEST 
    WHERE FLAG = 1; 

私は、これは危険なようだということを強調しなければなりません。重複する可能性がありますid秒。実際にはデータベースに新しい値を挿入させ、ギャップについて心配する必要はありません。

+0

私は知っている、それはIDのためではない、私はイラストだけのIDを置く、IDがなぜ私の心に来たかわからない。それは誤解を招く、私はIDではない表示順序だったと言わなければならない。私の悪い。 – user1205746

関連する問題