错误#1442 MySQL - 触发器

时间:2013-06-25 10:34:28

标签: mysql database triggers

我在制作触发器时遇到问题。每当我插入一条记录(casello)时,我想在'nome1'中创建字段'nome'的'副本'。我收到此错误:

  

#1442 - 无法更新存储的函数/触发器中的表'casello',因为它已被调用此存储函数/触发器的语句使用。

我该如何解决? 这是我桌子的结构:

    --
    -- 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

作为一个简单的查询,它将起作用并复制数据。

1 个答案:

答案 0 :(得分: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是此处的关键字,而不是表名。