错误#1442 MySQL - 制作触发器 [英] Error #1442 MySQL - making a trigger

查看:237
本文介绍了错误#1442 MySQL - 制作触发器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题,触发。我想要做一个'复制'字段'nome'在'nome1'每当我插入记录(casello)。我收到此错误:


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


如何解决?
这是我的表的结构:

   -  
- Struttura della tabella`casello`
-

如果不存在则创建表`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 ````nome`(`n_nome`),
KEY`nome_autostrada`(`nome_autostrada`),
KEY`nome`(`nome`)
)ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 17;

-
- 每个数据库的单位数据库中的数据库。
-

INSERT INTO`casello`(`id`,` posizione`,`nome`,`nome1`,`modalita_pagamento`,
`servizio_assistenza`,`l_nome`,`nome_autostrada`)VALUES
(3,35,'napoli nord',NULL, ,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' ,'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');

-
- 触发器`casello`
-
DROP触发器如果存在`cp nome nome1`;
DELIMITER //
CREATE TRIGGER`cp nome nome1`插入后`casello`
每个行的更新casello
set casello.nome1 = casello.nome
/ /
DELIMITER;

当然,如果我这样做:

 更新casello 
SET casello.nome1 = casello.nome



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

解决方案

您可以这样实现:

  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 em> 之后插入行,可以更改 BEFORE INSERT >

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


I have a problem to making a trigger. I want make a 'copy' of field 'nome' in 'nome1' whenever I make an insert of a record (casello). I receive this error:

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

How Can i fix it? this is the structure of my table:

    --
    -- 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. Of course if I make this:

UPDATE casello
SET casello.nome1=casello.nome

as a simple query it will works and it copies data.

解决方案

You can achieve it like this:

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 ;

You don't make an UPDATE after the rows are inserted, you change them BEFORE they are INSERTed.

Note, NEW is a keyword here, not a table name.

这篇关于错误#1442 MySQL - 制作触发器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆