...आपको बता रहा है कि आपका spb_getWord()
SPB_WORD
. में पहले से मौजूद मान उत्पन्न कर रहा है मेज़। आपको यह जांचने के लिए फ़ंक्शन को अपडेट करने की आवश्यकता है कि फ़ंक्शन से बाहर निकलने से पहले शब्द पहले से मौजूद है या नहीं - यदि ऐसा होता है, तो इसे तब तक फिर से जेनरेट करें जब तक कि यह एक हिट न हो।
मुझे लगता है कि आपका spb_runme()
सदृश होना चाहिए:
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;
इसका उपयोग करने से आप word_id
को बदल सकेंगे एनयूएलएल का समर्थन नहीं करने के लिए। विदेशी कुंजी के साथ काम करते समय, तालिका को विदेशी कुंजी संदर्भों को पहले पॉप्युलेट करें - माता-पिता से शुरू करें, और फिर उसके बच्चों से निपटें।
मैंने जो दूसरा बदलाव किया, वह था spb_getWord()
. को स्टोर करना एक चर में (v_word
), क्योंकि फ़ंक्शन को कई बार कॉल करने का मतलब है कि आपको हर बार एक अलग मान मिलेगा।
आखिरी बात - मैंने डिलीट स्टेटमेंट हटा दिया। आपने टेबल को पहले ही छोटा कर दिया है, इसमें हटाने के लिए कुछ भी नहीं है। निश्चित रूप से j
. के मान से संबंधित कुछ भी नहीं है ।