0
我有一個數據表rel_user_article調用存儲過程不起作用
+---------+------------+
| user_id | article_id |
+---------+------------+
| 1 | -1 |
| 97 | 153 |
+---------+------------+
此表意味着接下來的邏輯設置:每個作者必須至少有1條和每篇文章必須至少有1個作者。當作者沒有文章時,比表必須有假關係:(uid,-1)
當作者添加他的第一篇文章比這個假關係必須被刪除。
我已經存儲了創建新關係和刪除假關係的過程。 刪除假的關係是這樣的:
CREATE PROCEDURE `rel_delete_fake`(IN `ids` TEXT, IN `tbl` VARCHAR(255),
IN `fake_f` VARCHAR(255), IN `real_f` VARCHAR(255))
MODIFIES SQL DATA
proc: begin
if (`ids` = '') then
leave proc;
end if;
set @s = concat('DELETE FROM ', `tbl`, ' WHERE (', `fake_f`,
' = "-1" AND ', `real_f`, ' IN (', `ids`, '))');
prepare qr from @s;
execute qr;
deallocate prepare qr;
end proc
創建「真實」的關係是這樣的:
CREATE DEFINER=`root`@`localhost` PROCEDURE `rel_create`(IN `ids1` TEXT,
IN `ids2` TEXT, IN `tbl` VARCHAR(255), IN `field1` VARCHAR(255),
IN `field2` VARCHAR(255))
MODIFIES SQL DATA
proc: begin
set @cur = 0;
set @id1_cur = 0;
set @id2_cur = 0;
set @id1_cur_old = NULL;
set @id2_cur_old = NULL;
if (`ids1` = '' or `ids2` = '') then
leave proc;
end if;
set @sql_str = concat('insert into ', `tbl`, ' (', `field1`, ', ', `field2`, ") values (?, ?)");
prepare qr from @sql_str;
loop1: loop
set @cur = @cur + 1;
set @id1_cur = substring_index(substring_index(`ids1`, ',', @cur), ',', -1);
set @id2_cur = substring_index(substring_index(`ids2`, ',', @cur), ',', -1);
if (@id1_cur = @id1_cur_old and @id2_cur = @id2_cur_old) then
leave proc;
end if;
execute qr using @id1_cur, @id2_cur;
set @id1_cur_old = @id1_cur;
set @id2_cur_old = @id2_cur;
end loop loop1;
deallocate prepare qr;
-- deleting fake records that became needless
-- even this doesn't work
call `rel_delete_fake`('1','rel_user_article','article_id','user_id');
leave proc;
-- deleting fake records that became needless
call `rel_delete_fake`(`ids1`, `tbl`, `field2`, `field1`);
call `rel_delete_fake`(`ids2`, `tbl`, `field1`, `field2`);
end proc
程序刪除假關係的作品。創建關係的過程只會創建新記錄,但不會調用rel_delete_fake過程。
爲了測試我發出下一個電話:
call `rel_create`('1','153','rel_user_article','user_id','article_id');
,並在結果:
+---------+------------+
| user_id | article_id |
+---------+------------+
| 1 | -1 |
| 1 | 153 |
| 97 | 153 |
+---------+------------+
爲什麼這樣(1,-1)不會被刪除?