sql >> Database >  >> RDS >> PostgreSQL

Waarom mislukt deze code in PostgreSQL en hoe kan dit worden opgelost (oplossing)? Is het een fout in de SQL-engine van Postgres?

... vertelt je dat je spb_getWord() genereert waarden die al bestaan ​​in de SPB_WORD tafel. U moet de functie bijwerken om te controleren of het woord al bestaat voordat u de functie verlaat. Als dit het geval is, genereert u het opnieuw totdat het een woord tegenkomt dat niet bestaat.

Ik denk dat je spb_runme() moet lijken op:

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;

Als u dit gebruikt, kunt u de word_id . wijzigen om NULL's niet te ondersteunen. Als u met refererende sleutels te maken hebt, vul dan de tabel de refererende sleutelreferenties eerst - begin bij de ouder en pak dan de kinderen aan.

De andere wijziging die ik heb aangebracht was het opslaan van de spb_getWord() in een variabele (v_word ), omdat het meerdere keren aanroepen van de functie betekent dat je elke keer een andere waarde krijgt.

Als laatste heb ik de delete-instructie verwijderd. Je hebt de tabel al afgekapt, er staat niets in om te verwijderen. Zeker niets geassocieerd met een waarde van j .



  1. PostgreSQL-procesnamen op Solaris

  2. Omgaan met MySQL-datum- en tijdstempels in Java

  3. Het belang van geheugeninstellingen in SQL Server begrijpen

  4. Hoe krijg ik een Unix-tijdstempel in MySQL van UTC-tijd?