Ошибка дублирующейся записи, когда запись начинается с подчеркивания - PullRequest
0 голосов
/ 25 января 2012

У меня есть Perl-скрипт, который вызывает процедуру сохранения в MySQL.Хранимая процедура очень проста: она проверяет, существует ли запись, и обновляет ее, если она существует.Если запись не существует, она создаст ее.Основной код выглядит следующим образом:

DELIMITER $$

CREATE DEFINER=`me`@`%` PROCEDURE `updateClientUsage`(IN inDate DATE, IN inPort SMALLINT(4), IN inOwner VARCHAR(255), IN inName VARCHAR(255), IN inEmailed TINYINT(1))
BEGIN
    IF EXISTS(SELECT * FROM client_usage WHERE port = inPort AND name = inName) THEN
        UPDATE client_usage SET date = inDate, emailed = '0' WHERE port = inPort AND name = inName;
    ELSE
        INSERT INTO client_usage (date, port, owner, name, emailed) 
        VALUES (inDate, inPort, inOwner, inName, inEmailed);
    END IF;
END

Когда я запускаю свой скрипт, он работает нормально, пока эта процедура не попытается обновить запись, которая начинается с подчеркивания (поле имени начинается с подчеркивания).Я получаю сообщение об ошибке, что есть повторяющаяся запись.Кто-нибудь знает, почему это так?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Это будет работать только при наличии уникального индекса или первичного ключа на port и name.Если первичный ключ или уникальный индекс определены в других столбцах, вы можете получить дубликаты ключей даже после проверки WHERE port = inPort AND name = inName.

0 голосов
/ 25 января 2012

Нет необходимости в условии, так как оно может быть указано в предложении where (тест такой же)

   UPDATE client_usage 
      SET date = inDate, emailed = '0'
    WHERE port = inPort AND name = inName
       ;

   INSERT INTO client_usage (date, port, owner, name, emailed) 
   VALUES (inDate, inPort, inOwner, inName, inEmailed)
   WHERE NOT EXISTS(SELECT *
        FROM client_usage 
       WHERE port = inPort AND name = inName
       )
       ;

Также в mysql слово 'name' является зарезервированным словом? Избегайте этого.

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