... cho bạn biết rằng spb_getWord()
của bạn đang tạo các giá trị đã tồn tại trong SPB_WORD
bàn. Bạn cần cập nhật hàm để kiểm tra xem từ đã tồn tại chưa trước khi thoát khỏi hàm - nếu có, hãy tạo lại cho đến khi nó chạm vào từ chưa tồn tại.
Tôi nghĩ spb_runme()
của bạn cần giống:
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;
Sử dụng điều này sẽ cho phép bạn thay đổi word_id
để không hỗ trợ NULL. Khi xử lý khóa ngoại, hãy điền vào bảng tham chiếu khóa ngoại đầu tiên - bắt đầu với cha mẹ, và sau đó giải quyết con cái của nó.
Thay đổi khác mà tôi đã thực hiện là lưu trữ spb_getWord()
trong một biến (v_word
), bởi vì gọi hàm nhiều lần có nghĩa là bạn sẽ nhận được một giá trị khác nhau mỗi lần.
Điều cuối cùng - tôi đã xóa câu lệnh xóa. Bạn đã cắt bớt bảng, không có gì trong đó để xóa. Chắc chắn không có gì liên quan đến giá trị của j
.