Próbuję utworzyć procedurę przechowywaną, która będzie podnosić rekord w bazie danych i zwrócić nowo utworzony identyfikator. Jeśli rekord o tej samej nazwie już istnieje, powinien zwrócić identyfikator tego rekordu. To właśnie mam do tej pory, działa na nowo włożone rekordy, ale nic nie zwraca, jeśli rekord już istnieje.

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_tag`(IN `tag_name_in` VARCHAR(255), OUT `tag_id_out` INT) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER 
BEGIN 
    INSERT INTO tag (name) VALUES (tag_name_in); 
    IF ROW_COUNT() = 1 THEN 
        SET tag_id_out = LAST_INSERT_ID(); 
    ELSE 
        SELECT id INTO tag_id_out FROM tag WHERE name=tag_name_in; 
    END IF; 
END
0
Asis 8 czerwiec 2021, 16:12

2 odpowiedzi

Najlepsza odpowiedź

W ogóle nie widzę powodu, aby użyć LAST_INSERT_ID().

CREATE 
DEFINER=`root`@`localhost` 
PROCEDURE `insert_tag`(IN `tag_name_in` VARCHAR(255), OUT `tag_id_out` INT) 
NOT DETERMINISTIC 
NO SQL 
SQL SECURITY DEFINER 
BEGIN 
    INSERT IGNORE INTO tag (name) VALUES (tag_name_in); 
    SELECT id INTO tag_id_out FROM tag WHERE name=tag_name_in; 
END

Ze względu na tekst pytanie tag (name) jest zdefiniowany jako unikalny (może nawet klucz podstawowy).

1
Akina 8 czerwiec 2021, 13:19

Oświadczenie else powinno być zamiast tego: SET tag_id_out = SELECT id FROM tag WHERE name=tag_name_in;

Tak więc będzie tak wyglądać:


CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_tag`(IN `tag_name_in` VARCHAR(255), OUT `tag_id_out` INT) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER 
BEGIN 
    INSERT INTO tag (name) VALUES (tag_name_in); 
    IF ROW_COUNT() = 1 THEN 
        SET tag_id_out = LAST_INSERT_ID(); 
    ELSE 
        SET tag_id_out = SELECT id FROM tag WHERE name=tag_name_in; 
    END IF; 
END

0
LeventHAN 8 czerwiec 2021, 13:16