raspberry-pimariadb-10.3

Getting errors with my mariadb-10.3 version


I'm looking for a function that insert data if they are not existing.

I tried with IF not exists but I think that my mariadb version is no up enought to handle this.

So I'm trying with NOT IN, but get the same issue...

CREATE DEFINER=`root`@`localhost` PROCEDURE `close_ticket`(IN idT INT,IN accuse VARCHAR(45),IN lienAccuse VARCHAR(60), IN lienG VARCHAR(60),IN jours INT,IN reason VARCHAR(250), IN isclosed BOOLEAN)
BEGIN
    INSERT INTO bot_onet.accuse (`Pseudo`,`lienFaceit`) SELECT accuse,lienAccuse
        WHERE lienAccuse NOT IN(SELECT `lienFaceit` FROM `bot_onet`.`accuse` );
    SELECT @ID :=  `idAccuse` FROM bot_onet.accuse WHERE `lienFaceit` = lienAccuse;
    INSERT INTO bot_onet.ticket_has_accuse (`Ticket_idTicket`,`Accuse_idAccuse`,`duree`,`timecode`,`unbaned`,`raison`) VALUES (idT,@ID,jours,unix_timestamp(),FALSE,reason) ;
    UPDATE bot_onet.ticket SET `Fermeture` = unix_timestamp(),`closed` = isclosed, `LienGame` = LienG WHERE idTicket = idT;
END

Piece of code which create the bug

INSERT INTO `bot_onet`.`Accuse` (`Pseudo`,`lienFaceit`) SELECT 'C0casio45','test' 
WHERE 'C0casio45' NOT IN(SELECT `Pseudo` FROM `bot_onet`.`Accuse`)

error code

09:52:12    
INSERT INTO bot_onet.Accuse (`Pseudo`,`lienFaceit`) SELECT 'test','faceit/test'   
WHERE lienAccuse NOT IN(SELECT lienAccuse FROM bot_onet.Accuse )    Error Code: 1064. 
You have an error in your SQL syntax; 
check the manual that corresponds to your MariaDB server version for the right syntax to use near 
'WHERE lienAccuse NOT IN(SELECT lienAccuse FROM bot_onet.Accuse )' at line 2    
0.110 sec

And if i use the from statement, it returns no error but he is not insert data too

INSERT INTO `bot_onet`.`Accuse` (`Pseudo`,`lienFaceit`) SELECT 'C0casio45','test' 
FROM `bot_onet`.`Accuse` WHERE 'C0casio45' NOT IN(SELECT `Pseudo` FROM `bot_onet`.`Accuse`)

Solution

  • CREATE DEFINER=`root`@`localhost` 
    PROCEDURE `close_ticket`(IN idT INT,
                             IN accuse VARCHAR(45),
                             IN lienAccuse VARCHAR(60), 
                             IN lienG VARCHAR(60),
                             IN jours INT,
                             IN reason VARCHAR(250), 
                             IN isclosed BOOLEAN)
    BEGIN
        INSERT INTO bot_onet.accuse (`Pseudo`,`lienFaceit`) 
        SELECT accuse,              -- IN accuse VARCHAR(45) is used
                      lienAccuse    -- IN lienAccuse VARCHAR(60) is used
    -- FROM clause is lost
        WHERE lienAccuse            -- IN lienAccuse VARCHAR(60) is used
                         NOT IN( SELECT `lienFaceit` 
                                 FROM `bot_onet`.`accuse` );
        SELECT @ID := `idAccuse` 
        FROM bot_onet.accuse 
        WHERE `lienFaceit` = lienAccuse;   -- IN lienAccuse VARCHAR(60) is used
        INSERT INTO bot_onet.ticket_has_accuse (`Ticket_idTicket`,`Accuse_idAccuse`,`duree`,`timecode`,`unbaned`,`raison`) 
        VALUES (idT,@ID,jours,unix_timestamp(),FALSE,reason);  -- idT,jours and reason SP parameters are used
        UPDATE bot_onet.ticket 
        SET `Fermeture` = unix_timestamp(),
            `closed` = isclosed, 
            `LienGame` = LienG 
        WHERE idTicket = idT;   -- IN idT INT is used
    END
    

    error code

    Error message tells that FROM clause is absent.