PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dlaczego ten kod nie działa w PostgreSQL i jak to naprawić (obejście)? Czy to usterka silnika Postgres SQL?

...mówi ci, że twój spb_getWord() generuje wartości, które już istnieją w SPB_WORD stół. Musisz zaktualizować funkcję, aby sprawdzić, czy słowo już istnieje przed wyjściem z funkcji - jeśli tak, generuj ponownie, aż trafi na słowo, które nie działa.

Myślę, że twój spb_runme() musi przypominać:

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;

Użycie tego umożliwiłoby zmianę word_id nie obsługiwać wartości NULL. Kiedy masz do czynienia z kluczami obcymi, wypełnij tabelę, do której klucz obcy odwołuje się najpierw - zacznij od rodzica, a potem zajmij się jego dziećmi.

Inną zmianą, którą wprowadziłem, było przechowywanie spb_getWord() w zmiennej (v_word ), ponieważ wielokrotne wywołanie funkcji oznacza, że ​​za każdym razem otrzymasz inną wartość.

Ostatnia rzecz - usunąłem deklarację usuwania. Tabela została już skrócona, nie ma tam nic do usunięcia. Z pewnością nic nie jest powiązane z wartością j .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails Activerecord Relacja:użycie podzapytania jako tabeli dla instrukcji SQL select

  2. Instrukcja Postgresql CASE - czy mogę użyć wartości zwracanej przez CASE w moim SELECT?

  3. Jak uzyskać dostęp do widoków db za pomocą modeli Laravel?

  4. Znajdź filmy z największą liczbą nagród w danym roku — powielanie kodu

  5. Jak zmienić ustawienia regionalne podczas formatowania liczb w PostgreSQL?