PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tại sao mã này không thành công trong PostgreSQL và làm thế nào để khắc phục nó (làm việc xung quanh)? Nó có phải là lỗ hổng công cụ Postgres SQL không?

... 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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:Tạo chỉ mục trên dấu thời gian ::DATE

  2. Tách ngày dựa trên Năm tài chính

  3. PostgreSQL:cách tốt nhất để tham gia các tập hợp con nhỏ của các bảng lớn

  4. Tìm các bản ghi mà sự tham gia không tồn tại

  5. Cách sắp xếp các bộ giá trị riêng biệt trong một truy vấn PostgreSQL