sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvorfor fejler denne kode i PostgreSQL, og hvordan rettes den (omgås)? Er det Postgres SQL-motorfejl?

... fortæller dig, at din spb_getWord() genererer værdier, der allerede findes i SPB_WORD bord. Du skal opdatere funktionen for at kontrollere, om ordet allerede eksisterer, før du afslutter funktionen - hvis det gør, gengenerer du, indtil det rammer et, der ikke gør.

Jeg tror, ​​din spb_runme() skal ligne:

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;

Ved at bruge dette vil du kunne ændre word_id for ikke at understøtte NULLs. Når du beskæftiger dig med fremmednøgler, skal du udfylde tabellen, hvor de fremmede nøglereferencer først - start med forælderen, og tag derefter fat på dens børn.

Den anden ændring, jeg lavede, var at gemme spb_getWord() i en variabel (v_word ), fordi at kalde funktionen flere gange betyder, at du får en anden værdi hver gang.

Sidste ting - jeg fjernede sletningserklæringen. Du har allerede afkortet tabellen, der er intet derinde at slette. Der er bestemt intet forbundet med en værdi på j .



  1. MYSQL modtager ikke data fra PHP

  2. Hukommelsesgrænser i SQL Server 2016 SP1

  3. laravel med:Kolonne ikke fundet

  4. Webinar:Nye funktioner i PostgreSQL 11 [Opfølgning]