在插入MySql触发器之前替换new.id

时间:2017-09-12 18:35:39

标签: mysql sql triggers

我有以下场景:我有一个product_category表,用于管理这些列的产品和类别之间的关系: id,product_id,category_id

我有另一个表(cat_eq),它将某些类别与另一个类别组合在一起:

id, mykey, source_cat_id, destiny_cat_id

source_cat_id列是VARCHAR,用于存储以逗号分隔的ID。例如:12,25

我需要编写一个触发器,在插入product_category表之前检查new.category_id是否在SELECT给出一些 mykey ,例如:

if(new.category_id in 
    (select source_cat_id from cat_eq where clave = 'man') ) 
then 
  set new.category_id:=(select destiny_cat_id from cat_eq where clave = 'man');

当cat_eq有多个值时,假设(12,15)触发器只有在id_category位于cat_eq表行的第一位时才有效。

我想得到的就是相当于这个,在触发器中可以正常工作:

if(new.category_id in (12,25) ) 
then 
    set new.category_id:=(select destiny_cat_id from cat_eq where clave = 'man');

我该怎么做? 谢谢!

1 个答案:

答案 0 :(得分:2)

认为REGEXP是一个简单的解决方案:

IF EXISTS
  select 1 from cat_eq where clave = 'man' AND 
     source_cat_id REGEXP CONCAT('(^|,)', new.category_id, '(,|$)')

基本上,你正在寻找以category_id开头,然后是逗号的东西,以逗号开头,然后是category_id,然后是另一个逗号,或以逗号开头,后面是category_id然后匹配结束。

第二种方法可能只是一个LIKE条款:

select 1 from cat_eq where clave = 'man' 
     AND CONCAT(',',source_cat_id,',') LIKE CONCAT('%,',category_id,',%')