MySQL несколько операторов вставки в хранимой процедуре - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь запустить несколько операторов вставки на основе условия в phpmyadmin через хранимую процедуру. Я не могу запустить более двух операторов вставки через хранимую процедуру, он игнорирует другие операторы и выполняет только первые два, я не понимаю, что вызывает проблему. Я размещаю здесь свой код.

 DELIMITER $$ 
 CREATE DEFINER=`root`@`localhost` PROCEDURE `BULKINSERT`() 
 BEGIN  
    DECLARE company_id,department_id BIGINT;
    SELECT id INTO company_id FROM COMPANIES WHERE Name="Company 1" ; 
    IF company_id is null THEN 
            INSERT INTO companies(Name) VALUES("Company 1") ; 
            SET company_id=LAST_INSERT_ID() ; 
    END IF ; 
    SELECT id INTO department_id FROM DEPARTMENTS WHERE Name="Support 1" ; 
    IF department_id IS NULL THEN 
        INSERT INTO DEPARTMENTS(Name,company_id) VALUES("Support 1",company_id) ;  
        SET department_id=LAST_INSERT_ID() ; 
    END IF ; 
    SELECT id INTO department_id FROM DEPARTMENTS WHERE Name="Finance" ; 
    IF department_id IS NULL THEN 
        INSERT INTO DEPARTMENTS(Name,company_id) VALUES("Finance",company_id) ;  
        SET department_id=LAST_INSERT_ID() ; 
    END IF ; 
    SELECT id INTO department_id FROM DEPARTMENTS WHERE Name="Digital" ; 
    IF department_id IS NULL THEN 
        INSERT INTO DEPARTMENTS(Name,company_id) VALUES("Digital",company_id) ;  
        SET department_id=LAST_INSERT_ID() ; 
    END IF ; 
    SELECT id INTO department_id FROM DEPARTMENTS WHERE Name="BI TEST" ; 
    IF department_id IS NULL THEN 
        INSERT INTO DEPARTMENTS(Name,company_id) VALUES("BI TEST",company_id) ;  
        SET department_id=LAST_INSERT_ID() ; 
    END IF ; 
 END $$ 
 DELIMITER ;

В приведенном выше коде обновляются только первая компания «Компания 1» и первый отдел «Поддержка 1». После этого контроль прекращается. Я не понимаю, почему это происходит. Есть ли какие-либо ограничения на выполнение запросов в хранимой процедуре MYSQL?

Заранее спасибо,
Amar

1 Ответ

0 голосов
/ 17 июня 2020

Если SELECT не соответствует чему-либо, он никогда не присваивается переменной department_id, поэтому он сохраняет свое значение из предыдущего INSERT.

Если Name - уникальный ключ в таблицу, вы можете использовать INSERT IGNORE, чтобы вставить все имена, которые еще не существуют.

DELIMITER $$ 
 CREATE DEFINER=`root`@`localhost` PROCEDURE `BULKINSERT`() 
 BEGIN  
    DECLARE company_id BIGINT;
    SELECT id INTO company_id FROM COMPANIES WHERE Name="Company 1" ; 
    IF company_id is null THEN 
            INSERT INTO companies(Name) VALUES("Company 1") ; 
            SET company_id=LAST_INSERT_ID() ; 
    END IF ; 
    INSERT INTO DEPARTMENTS (Name, company_id) VALUES
    ("Support 1", company_id),
    ("Finance", company_id),
    ("Digital", company_id),
    ("BI TEST", company_id);
END %%
DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...