【问题标题】:Error #1442 MySQL - making a trigger错误 #1442 MySQL - 制作触发器
【发布时间】:2013-06-25 10:34:28
【问题描述】:

我在制作触发器时遇到问题。每当我插入记录(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 ;

附:当然,如果我这样做:

UPDATE casello
SET casello.nome1=casello.nome

作为一个简单的查询,它可以工作并复制数据。

【问题讨论】:

    标签: mysql database triggers


    【解决方案1】:

    你可以这样实现:

    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,它们是INSERTed。

    注意,NEW 是这里的关键字,而不是表名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2019-11-15
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多