Mysql усеченное неверное значение DOUBLE для проверки строки - PullRequest
1 голос
/ 02 апреля 2019

У меня есть хранимая процедура

CREATE PROCEDURE `DeleteAttachmentsByIDs`(IN p_ids nvarchar(1024), IN p_modifiedBy varchar(100), IN p_modifiedDate datetime)
BEGIN
    update attachments set
    `IsDeleted` = 1
    , `ModifiedBy` = p_modifiedBy
    , `ModifiedDate` = p_modifiedDate
    where 
    id IN (p_ids);
END

Теперь я позвонил с

CALL `DeleteAttachmentsByIDs`('12479,12480,12481', 'admin', '2019-04-02 15:32:30.558178')

И приходит ошибка

Error Code: 1292. Truncated incorrect DOUBLE value: '12479,12480,12481'

Команда создания таблицы для таблицы вложений:

CREATE TABLE `attachments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ObjectID` int(11) DEFAULT NULL,
  `ObjectName` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Category` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  `ContentType` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `ContentLength` bigint(20) DEFAULT NULL,
  `FileName` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Data` longblob,
  `Description` varchar(500) CHARACTER SET utf8 DEFAULT NULL,
  `CreatedBy` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  `CreatedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `ModifiedBy` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  `ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `IsDeleted` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `Index1` (`id`,`ObjectID`,`ObjectName`,`IsDeleted`)
) ENGINE=InnoDB AUTO_INCREMENT=12482 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Я думаю, что это может быть вызвано условием ' in ', которое требует массив, однако строка передается. Я думаю, мне нужно разбить строку на массив, чтобы сделать ' in 'работает. Это правильно и как я могу это сделать?

1 Ответ

2 голосов
/ 02 апреля 2019

Вы можете использовать FIND_IN_SET в этом случае:

CREATE PROCEDURE `DeleteAttachmentsByIDs` (IN p_ids NVARCHAR(1024), IN p_modifiedBy VARCHAR(100), IN p_modifiedDate DATETIME)
BEGIN
    UPDATE attachments SET
        `IsDeleted` = 1,
        `ModifiedBy` = p_modifiedBy,
        `ModifiedDate` = p_modifiedDate
    WHERE FIND_IN_SET(id, p_ids) > 0 AND id <> 0; -- AND id <> 0 to support safe-mode.
END

Другое решение может быть следующим, используя сравнение строк с LIKE:

CREATE PROCEDURE `DeleteAttachmentsByIDs` (IN p_ids NVARCHAR(1024), IN p_modifiedBy VARCHAR(100), IN p_modifiedDate DATETIME)
BEGIN
    UPDATE attachments SET
        `IsDeleted` = 1,
        `ModifiedBy` = p_modifiedBy,
        `ModifiedDate` = p_modifiedDate
    WHERE CONCAT(',', p_ids, ',') LIKE CONCAT('%,', id, ',%') AND id <> 0; -- AND id <> 0 to support safe-mode.
END

MySQL Workbench по умолчанию использует безопасный режим.Таким образом, вы можете добавить AND id <> 0 для подавления ошибки, выдаваемой MySQL Workbench.Подробнее о безопасном режиме читайте здесь: Код ошибки MySQL: 1175 во время ОБНОВЛЕНИЯ в MySQL Workbench

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