错误代码:1648。条件项'MESSAGE_TEXT'的数据太长

时间:2013-02-05 14:18:18

标签: mysql triggers compiler-errors mysql-workbench

这是我的触发器,我声明 msg varchar(255)我试图将它从255更改为550 但它并没有停止发给我错误代码:

* 错误代码:1648。条件项'MESSAGE_TEXT *

的数据太长

msg变量在触发器中声明;触发器是两个触发器的合并(我正在使用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;

2 个答案:

答案 0 :(得分:1)

在MySQL中,{p> MESSAGE_TEXTVARCHAR(128)。您尝试分配的某些消息比此更长。

我想一个人不能简单地重新定义MESSAGE_TEXT,所以你必须提出一个更短的消息。看到 https://dev.mysql.com/doc/refman/5.5/en/signal.html#signal-condition-information-items

答案 1 :(得分:1)

我认为您不能修改条件项的定义(请参见this)。 MESSAGE_TEXT的定义是VARCHAR(128);我试图更改此设置,但无法更改。

但是,您可以使用MariaDB(类似于MySQL)。在MariaDB中,条件项MESSAGE_TEXT的定义为VARCHAR(512)。因此,您无法更改此设置,但现在可以包含更多内容。 This仅适用于10.3.6及更高版本的MariaDB。