sql >> Databáze >  >> RDS >> PostgreSQL

Proč tento kód selže v PostgreSQL a jak to opravit (obešení)? Je to chyba enginu Postgres SQL?

... vám říká, že vaše spb_getWord() generuje hodnoty, které již existují v SPB_WORD stůl. Před ukončením funkce musíte aktualizovat funkci, abyste zkontrolovali, zda slovo již existuje - pokud ano, generujte znovu, dokud nenarazí na slovo, které neexistuje.

Myslím, že vaše spb_runme() se musí podobat:

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;

Pomocí tohoto byste mohli změnit word_id nepodporovat hodnoty NULL. Při práci s cizími klíči naplňte tabulku nejprve odkazy na cizí klíče - začněte u rodiče a pak se pusťte do jeho dětí.

Další změnou, kterou jsem provedl, bylo uložení spb_getWord() v proměnné (v_word ), protože volání funkce vícekrát znamená, že pokaždé získáte jinou hodnotu.

Poslední věc - odstranil jsem příkaz delete. Tabulku jste již zkrátili, není v ní co smazat. Rozhodně nic není spojeno s hodnotou j .



  1. Přidejte Ordinal Indicator k datu v PostgreSQL

  2. Aktualizace SQL Maria DB s připraveným prohlášením

  3. Chyba v příkazu SQL pomocí sloupce INSERT a AUTO-INCREMENT

  4. Podmínka IF MySQL