Mysql 设置父行id的触发器

Mysql 设置父行id的触发器,mysql,triggers,Mysql,Triggers,我肯定我在这里做错了几件事。让我来设定目标 我有一个简单的表,其中列如下: ----------------------------------------- id | name | code | parentCode | parentId 1 | locOne | loc1 | | 2 | locTwo | loc2 | loc1 | (grab value of 1) 3 | locThr | loc3 | loc2 | (grab

我肯定我在这里做错了几件事。让我来设定目标

我有一个简单的表,其中列如下:

----------------------------------------- id | name | code | parentCode | parentId 1 | locOne | loc1 | | 2 | locTwo | loc2 | loc1 | (grab value of 1) 3 | locThr | loc3 | loc2 | (grab value of 2) 这引发了错误:

无法写入行

MySQL说:

无法更新存储函数/触发器中的表“位置”,因为它是 已由调用此存储函数/触发器的语句使用


2) 第二个问题——如何执行?

在MySQL中,您不能对已定义触发器的表发出DML语句。 但您可以做的是在触发器之前使用
来更改正在插入或更新的值

现在假设表的模式类似于

CREATE TABLE location
(
  id int not null auto_increment primary key, 
  name varchar(128), 
  code varchar(128), 
  parentCode varchar(128), 
  parentId int
)
你的扳机看起来像

CREATE TRIGGER tg_bi_location
BEFORE INSERT ON location
FOR EACH ROW
  SET NEW.parentId = (SELECT id 
                        FROM location 
                       WHERE code = NEW.parentCode);
name,code,parentCode "locOne","loc1", "locTwo","loc2","loc1" "locThr","loc3","loc2" 这里是演示


现在假设您的CSV文件

CREATE TRIGGER tg_bi_location
BEFORE INSERT ON location
FOR EACH ROW
  SET NEW.parentId = (SELECT id 
                        FROM location 
                       WHERE code = NEW.parentCode);
name,code,parentCode "locOne","loc1", "locTwo","loc2","loc1" "locThr","loc3","loc2"
谢谢你,彼得。这是一个非常清楚的解释,完美地解决了这个问题。而且,我不知道SQLFiddle,所以还有一个学习资源。我真的很感激你周到的回答。我有一个非常非规范化的报告表。这种在插入之前设置值的方法可以让我更容易地保持很多东西的同步。允许在不实际定义关系的情况下快速查询键。@manisha非常欢迎您。我很高兴能帮上忙:)祝你好运。