sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför den här koden misslyckas i PostgreSQL och hur man fixar det (lösning)? Är det Postgres SQL-motorfel?

... berättar att din spb_getWord() genererar värden som redan finns i SPB_WORD tabell. Du måste uppdatera funktionen för att kontrollera om ordet redan finns innan du avslutar funktionen - om det gör det, generera om tills det träffar ett som inte gör det.

Jag tror att din spb_runme() måste likna:

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;

Genom att använda detta kan du ändra word_id att inte stödja NULLs. När du hanterar främmande nycklar fyller du i tabellen med främmande nycklar först - börja med föräldern och ta itu med dess barn.

Den andra ändringen jag gjorde var att lagra spb_getWord() i en variabel (v_word ), eftersom att anropa funktionen flera gånger innebär att du får ett annat värde varje gång.

Sista saken - jag tog bort delete-satsen. Du har redan trunkerat tabellen, det finns inget där att ta bort. Absolut ingenting som är kopplat till ett värde på j .



  1. SQL-fråga där fältet INTE innehåller $x

  2. Databasen uppdateras inte automatiskt med MySQL och Python

  3. Gräns ​​för tillståndet WHERE col IN (...).

  4. Vilken är den bästa teckenuppsättningen för e-postfält?