2013-06-25 5 views
0

У меня проблема с созданием триггера. Я хочу сделать «копию» поля «nome» в «nome1» всякий раз, когда я вставляю запись (casello). Я получаю эту ошибку:Ошибка # 1442 MySQL - запуск триггера

#1442 - Can't update table 'casello' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Как я могу это исправить? это структура моего стола:

-- 
    -- Struttura della tabella `casello` 
    -- 

    CREATE TABLE IF NOT EXISTS `casello` (
    `id` int(3) NOT NULL AUTO_INCREMENT, 
    `posizione` double NOT NULL, 
    `nome` varchar(100) NOT NULL, 
    `nome1` varchar(100) DEFAULT NULL, 
    `modalita_pagamento` varchar(255) NOT NULL, 
    `servizio_assistenza` tinyint(1) DEFAULT NULL, 
    `l_nome` varchar(100) DEFAULT NULL, 
    `nome_autostrada` varchar(4) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `l_nome` (`l_nome`), 
    KEY `nome_autostrada` (`nome_autostrada`), 
    KEY `nome` (`nome`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ; 

    -- 
    -- Dump dei dati per la tabella `casello` 
    -- 

    INSERT INTO `casello` (`id`, `posizione`, `nome`, `nome1`, `modalita_pagamento`, 
      `servizio_assistenza`, `l_nome`, `nome_autostrada`) VALUES 
    (3, 35, 'napoli nord', NULL, 'contanti, carte, telepass', 1, 'caserta', 'a1'), 
    (4, 15, 'napoli sud', NULL, 'contanti, carte, telepass', 1, 'napoli', 'a1'), 
    (5, 310, 'roma nord', NULL, 'contanti, carte, telepass', 1, NULL, 'a1'), 
    (6, 280, 'roma sud', NULL, 'contanti, carte, telepass', 1, NULL, 'a1'), 
    (11, 25, 'palma campania', 'NULL', 'contanti, carte, telepass', 1, NULL, 'a30'), 
    (12, 30, 'sarno', 'NULL', 'contanti, carte, telepass', NULL, NULL, 'a30'), 
    (13, 35, 'nocera', NULL, 'contanti, carte, telepass', 1, NULL, 'a30'); 

    -- 
    -- Triggers `casello` 
    -- 
    DROP TRIGGER IF EXISTS `cp nome nome1`; 
    DELIMITER // 
    CREATE TRIGGER `cp nome nome1` AFTER INSERT ON `casello` 
    FOR EACH ROW UPDATE casello 
    set casello.nome1=casello.nome 
    // 
    DELIMITER ; 

P.S. Конечно, если я это сделаю:

UPDATE casello 
SET casello.nome1=casello.nome 

как простой запрос он будет работать и копирует данные.

ответ

0

Вы можете достичь его, как это:

DROP TRIGGER IF EXISTS `cp nome nome1`; 
DELIMITER // 
CREATE TRIGGER `cp nome nome1` BEFORE INSERT ON `casello` 
FOR EACH ROW 
SET NEW.nome1=NEW.nome 
// 
DELIMITER ; 

Вы не сделать UPDATEпосле строки вставляются, то изменить их BEFORE они INSERT ред.

Примечание: NEW - это ключевое слово, а не имя таблицы.

+0

Это не работает, это дает мне ошибку 1442. – user2519507

+0

В чем именно ошибка? Прекрасно подходит для меня. – fancyPants

Смежные вопросы