错误代码:1648。条件项“MESSAGE_TEXT”的数据太长
Posted
技术标签:
【中文标题】错误代码:1648。条件项“MESSAGE_TEXT”的数据太长【英文标题】:Error Code: 1648. Data too long for condition item 'MESSAGE_TEXT' 【发布时间】:2013-01-20 12:04:09 【问题描述】:这是我的触发器,我已声明 msg varchar(255) 并且 我已尝试将其从 255 更改为 550 但它并没有停止把错误代码发给我:
*错误代码:1648。条件项“MESSAGE_TEXT*”的数据太长
msg 变量在触发器中声明;触发器是 2 个触发器的合并(我正在使用 mysql,我不能在一个表上对相同的操作时间和事件使用多个触发器)这是正文:
-- --------------------------------------------------------------------------------------------------
CREATE TRIGGER BEFORE_INSERT_ON_SENTIERO__HA__TAPPA
BEFORE INSERT ON SENTIERO__HA__TAPPA
FOR EACH ROW
BEGIN
/* TRIGGER controlla_MaxCARDINALITA_INSERT */
-- variables for controlla_MaxCARDINALITA_INSERT
DECLARE max_cardinalita INTEGER;
DECLARE msg varchar(255);
-- variables for controlla_corrispondenzaTappaFineInizio_INSERT
DECLARE temp_tappaOLD INTEGER;
DECLARE temp_posizione_tappaOLD INTEGER;
DECLARE temp_inizio_tappaNEW VARCHAR(45);
DECLARE temp_fine_tappaOLD VARCHAR(45);
SELECT COUNT(*) into max_cardinalita
FROM SENTIERO__HA__TAPPA
WHERE IDsentiero=NEW.IDsentiero;
IF max_cardinalita>=10 THEN
set msg = 'INSERT: Il sentiero ha già il massimo numero di tappe consentito ';
signal sqlstate '45000' set message_text = msg;
END IF;
/* TRIGGER controlla_corrispondenzaTappaFineInizio_INSERT */
IF EXISTS ( SELECT IDsentiero, IDtappa
FROM SENTIERO__HA__TAPPA as sht
WHERE NEW.IDsentiero=sht.IDsentiero and NEW.IDtappa=sht.IDtappa) THEN
set msg = 'INSERT: La tappa inserita è già presente nel sentiero; non è possibile inserirla 2 volte ';
signal sqlstate '45000' set message_text = msg;
END IF;
SELECT IDtappa into temp_tappaOLD
FROM SENTIERO__HA__TAPPA as sht1
WHERE NEW.IDsentiero=sht1.IDsentiero and posizione_tappa>=ALL ( SELECT posizione_tappa
FROM SENTIERO__HA__TAPPA as sht2
WHERE NEW.IDsentiero=sht2.IDsentiero );
SELECT posizione_tappa into temp_posizione_tappaOLD
FROM SENTIERO__HA__TAPPA as sht
WHERE NEW.IDsentiero=sht.IDsentiero and temp_tappaOLD=sht.IDtappa;
IF NEW.posizione_tappa<>temp_posizione_tappaOLD THEN
set msg = 'INSERT: La posizione della tappa inserita deve essere consecutiva alla posizione dell ultima tappa di quel sentiero: le tappe devono essere consecutive ';
signal sqlstate '45000' set message_text = msg;
END IF;
SELECT inizio into temp_inizio_tappaNEW
FROM TAPPA
WHERE NEW.IDtappa=TAPPA.IDtappa;
SELECT fine into temp_fine_tappaOLD
FROM TAPPA
WHERE temp_tappaOLD=TAPPA.IDtappa;
IF temp_inizio_tappaNEW<>temp_fine_tappaOLD THEN
set msg = 'INSERT: La fine della tappa precedente non corrisponde con l inizio di questa tappa: le tappe devono essere consecutive ';
signal sqlstate '45000' set message_text = msg;
END IF;
END$$
-- --------------------------------------------------------------------------------------------------
编辑 ::
DECLARE msg varchar(5);
set msg = concat('I');
signal sqlstate '45000' set message_text = msg;
【问题讨论】:
原因是您插入的文本超出了为列MESSAGE_TEXT
分配的最大数量。例如,最大长度为 50,但您插入的值大于 50。
在不使用该变量之前不会检查 MESSAGE_TEXT 的大小,对吗?因为我在另一个触发器中具有相同的变量类型、大小和名称,但我没有得到 使用 SIGNAL 引发的错误代码
ANYWAY 如果我将 msg VARCHAR(255) 更改为 msg VARCHAR(50) 和 set msg = concat('INSERT ') ,它 不起作用 !
你连接的字符串有多长?
改成DECLARE msg varchar(MAX);
会不会报错?
【参考方案1】:
MESSAGE_TEXT
在 MySQL 中是 VARCHAR(128)
。您尝试在此处分配的某些消息比这更长。
我想不能简单地重新定义 MESSAGE_TEXT 所以你必须想出一个更短的消息。看 https://dev.mysql.com/doc/refman/5.5/en/signal.html#signal-condition-information-items.
【讨论】:
【参考方案2】:我认为你不能修改条件项的定义(见this)。 MESSAGE_TEXT
的定义是VARCHAR(128)
;我试图改变这一点,但不能。
但是,您可以使用 MariaDB(像 MySQL 一样工作)。在 MariaDB 中,条件项 MESSAGE_TEXT
具有定义 VARCHAR(512)
。所以,你不能改变它,但它现在可以包含更多。 This 仅适用于 10.3.6 及以上版本的 MariaDB。
【讨论】:
以上是关于错误代码:1648。条件项“MESSAGE_TEXT”的数据太长的主要内容,如果未能解决你的问题,请参考以下文章