2013-07-09 204 views
0

之前从其他表表更新值我试图从另一个表插入之前更新的值 - 这里是我有:MYSQL触发器 - 插入

2表

hbrpg_geo{ 
... 
id INT  //id that needs to be written into hbrpg_person 
zip VARCHAR(10) //contains postcode 
... 
} 

hbrpg_person{ 
... 
fk_postcode  // initially it's filled with UK postcode - but trigger should change value to id of hbrpg_geo of matching postcode (hbrpg_geo.zip). 
... 
} 

触发:

... 

BEGIN 
    DECLARE NP_VAR integer; 
    DECLARE OP_VAR TEXT; 
    SET OP_VAR = NEW.fk_postcode; 
    SET TE_VAR = OP_VAR; 
    SELECT hbrpg_geo.id INTO NP_VAR FROM hbrpg_geo WHERE hbrpg_geo.zip = OP_VAR; 
    SET NEW.fk_postcode = NP_VAR; 
END 

这一切都似乎是从工作分开:

SET OP_VAR = NEW.fk_postcode; 

如果我在引号中的有效英国邮政编码(即:“W1 3XX”)取代NEW.fk_postcode它工作正常,并触发替换场fk_postcode与hbrpg_geo表的id。

我做错了什么?我怎样才能将NEW.fk_postcode的值赋给我刚才声明的变量?

+0

你知道新新fk_postcode值将是一个INT不是形式“W1 3XX”正确的? (它也显然是一个数据库自动增量列,并且大多是毫无意义的)也许还有另外一个可以使用的hbrpg_geo字段?压缩?除此之外,你只需要验证它是否在那里,而不是改变它。 – 2013-07-09 02:15:11

+0

对我来说,你似乎可以使用邮政编码作为你的'hbrpg_geo'表中的一个自然键,并且(可能)删除合成的'id'键。 – eggyal

+0

忘了补充一点,fk_postcode是一个整数。 –

回答

0

你分配的顺序:

SET OP_VAR = NEW.fk_postcode; 
. . . 
SET NEW.fk_postcode = NP_VAR; 

new.fk_postcode具有相同的类型。但是这些专栏分别是textinteger

您需要修复类型不兼容性。我的猜测是,fk_postcode实际上是一个整数,并与值(它将是一个字符串)分开。

+0

我认为触发器的目标是查看给定字符串的外部表,并用合成(整数)键代替,所有这些键都在INSERT命令中不可见地发生。 – eggyal

+0

@eggyal。 。 。问题是,'fk_postcode'的类型是什么?如果它是一个整数然后有问题。如果它是一个字符串,那么它可能工作。 –

+0

我想这是(或者至少应该是)FK引用'hbrpg_geo.id',因此是一个整数。但是你有什么问题呢? MySQL在执行'BEFORE'触发器之前执行类型检查吗?我没有尝试过,但我认为不是。触发器运行后,即使MySQL仍然将输入类型化为一个字符串,它将被隐式转换为整数,就像给一个整数列提供了一个字符串值“123”一样。或者不是吗? – eggyal