sql >> データベース >  >> RDS >> PostgreSQL

このコードがPostgreSQLで失敗する理由と、それを修正する方法(回避策)?それはPostgresSQLエンジンの欠陥ですか?

    ... spb_getWord() SPB_WORDにすでに存在する値を生成しています テーブル。関数を終了する前に、単語がすでに存在するかどうかを確認するために関数を更新する必要があります。存在する場合は、存在しない単語に到達するまで再生成します。

    あなたのspb_runme() 似ている必要があります:

    create or replace function spb_runme() returns void as $$
    DECLARE
      v_word VARCHAR(410);
    
    begin
      perform setval('spb_wordnum_seq', 1, false);
      truncate table spb_word4obj, spb_word, spb_obj_word;
    
      for j in 0 .. 50000-1 loop
    
        if j % 100 = 0 then raise notice 'j = %', j; end if;
    
        for i in 0 .. 20 - 1 loop
          v_word := spb_getWord();
          INSERT INTO spb_word (word) VALUES (v_word);
    
          INSERT INTO spb_word4obj 
            (word, idx, doc_id, word_id)
            SELECT w.word, i, j, w.id
              FROM SPB_WORD w 
             WHERE w.word = v_word;
    
        end loop;
    
        INSERT INTO spb_obj_word (word_id, idx, doc_id) 
        SELECT w4o.word_id, w4o.idx, w4o.doc_id 
          FROM SPB_WORD4OBJ w4o 
         WHERE w40.doc_id = j;
    
      end loop;
    end;
    

    これを使用すると、word_idを変更できます NULLをサポートしません。外部キーを処理するときは、外部キーが参照するテーブルに最初に入力します。 -親から始めて、次にその子に取り組みます。

    私が行ったもう1つの変更は、spb_getWord()を保存することでした。 変数内(v_word )、関数を複数回呼び出すと、毎回異なる値を取得することになるためです。

    最後に、deleteステートメントを削除しました。すでにテーブルを切り捨てています。削除するものはありません。確かに、jの値には何も関連付けられていません 。



    1. Mysqlクエリが更新されない

    2. PostgresqlのByteaデータ型に対する一意の制約

    3. IN句とパラメータを含むMySQLの誤った出力

    4. クライアントにSQLServerデータベースを使用してアプリケーションを展開する方法