mysql процедура без удаления данных - PullRequest
0 голосов
/ 04 августа 2020

У меня есть простая mysql процедура ниже для удаления данных из таблицы на основе переданного аргумента. Я получаю исключение сбоя внешнего ограничения, поскольку зависимые данные не удаляются. Я формирую список идентификаторов для удаления, так как хочу избежать полного сканирования таблицы при использовании подзапросов. Любая помощь приветствуется.

CREATE PROCEDURE `deleteService`(IN serviceID LONG)
BEGIN
    DECLARE rpslist varchar(512) DEFAULT "";
        DECLARE finished INTEGER DEFAULT 0;
    DECLARE rpsid varchar(512) DEFAULT "";
    DECLARE rpsidcursor 
        CURSOR FOR 
              select id from rpsa where so_id in (select id from rpso where rps_id = serviceID);
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET finished = 1;
 
        OPEN rpsidcursor; //fetch ids to delete
        getRPSId: LOOP       
            FETCH rpsidcursor INTO rpsid;
            IF finished = 1 THEN 
                LEAVE getRPSId;
            END IF;
        SET rpsid = concat("'",rpsid,"'"); -- form concatenated string of IDs
        SET rpslist = CONCAT(rpsid,",",rpslist);
        END LOOP getRPSId;
        CLOSE rpsidcursor;
        SET rpslist = substring(rpslist,1,length(rpslist) -1); -- remove last comma
        DELETE from uach where rpsa_id in (rpslist); -- delete dependent data . forming the list to hit index

    -- this statement fails bcos the delete above did not work and there is foreign constraint
        DELETE from rpsa where rpselectedso_id in (select id from rpselectedso where rpaxnservice_id = serviceID); 
END

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Почему бы просто не использовать прямые запросы:

CREATE PROCEDURE `deleteService`(IN serviceID LONG)
BEGIN

delete
from uach 
  join rpsa on rpsa.id=uach.rpsa_id
  join rpso on rpso.id=rpsa.so_id
where rpso.rps_id=serviceID;

delete 
from rpsa 
  join rpselectedso on rpselectedso.id=rpsa.rpselectedso_id
where rpselectedso.rpaxnservice_id=serviceID;

END
0 голосов
/ 04 августа 2020

Передача строковой переменной CSV, например IN (variable), не сработает, потому что MySQL будет видеть переменную как один элемент, а не как несколько идентификаторов. Если вы хотите сделать это, вам следует использовать запросы Dynami c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...