我有以下情形:我有一个product_category表,这些表使用这些列管理产品和类别之间的关系:
id,product_id,category_id
我还有另一个表(cat_eq),该表将某些类别与这些类别的另一个类别分组:
id, mykey, source_cat_id, destiny_cat_id
source_cat_id
列是存储逗号分隔ID的VARCHAR
。例如:12,25我需要编写一个触发器,该触发器在插入
product_category
表之前检查new.category_id
是否在生成给定mykey的SELECT
时产生的集合中,例如: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');
我怎样才能做到这一点?
谢谢!
最佳答案
认为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,',%')
关于mysql - 在插入MySql触发器之前,请替换new.id,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46183322/