繁体   English   中英

MySQL触发器检查具有可能NULL值的现有行

MySQL Trigger checking for existing rows with possible NULL values

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个InnoDB表,在performance_idticket_rank_idticket_type_id上有唯一索引。

所有这些id都与其他表有关系,但它们的值也可以为NULL 如果其中一个列值为NULL,MySQL允许重复的行,所以我决定为这个问题构建一个trigger

CREATE TRIGGER `before_insert_performance_tickets` 
BEFORE INSERT ON `performance_tickets` FOR EACH ROW BEGIN

DECLARE num_rows INTEGER;

SELECT COUNT(*) INTO num_rows FROM performance_tickets
WHERE performance_id = NEW.performance_id 
AND ticket_rank_id = NEW.ticket_rank_id
AND ticket_type_id = NEW.ticket_type_id;

IF num_rows > 0 THEN
   // Cancel insert action
ELSE
   // Perform insert action
END IF;

END

问题是AND ticket_rank_id = NEW.ticket_rank_id ,我必须检查ticket_rank_id是否为NULL或具有值。

AND ticket_rank_id = NULL不起作用,只有在我这样做时才能正常工作AND ticket_rank_id IS NULL

是否有任何光滑的解决方案,或者我必须编写单独的查询,具体取决于NEW.ticket_rank_idNEW.ticket_type_id是否为NULL?

2 个回复

您需要为NULL值添加额外的OR条件(ticket_rank_id IS NULL OR ticket_rank_id = NEW.ticket_rank_id)因为NULL与任何内容相比都返回FALSE 试试这个查询:

SELECT COUNT(*)
INTO num_rows
FROM performance_tickets
WHERE performance_id = NEW.performance_id
      AND (ticket_rank_id IS NULL OR ticket_rank_id = NEW.ticket_rank_id)
      AND (ticket_type_id IS NULL OR ticket_type_id = NEW.ticket_type_id);

我想我弄清楚了:

SELECT COUNT(*) INTO num_rows FROM performance_tickets
WHERE performance_id = NEW.performance_id 
AND IF(NEW.ticket_rank_id IS NULL, ticket_rank_id IS NULL, ticket_rank_id = NEW.ticket_rank_id)
AND IF(NEW.ticket_type_id IS NULL, ticket_type_id IS NULL, ticket_type_id = NEW.ticket_type_id)

似乎工作,现在我必须弄清楚如果num_rows == 1如何中止插入。 但这是一个不同的问题。

不管怎么说,多谢拉 ;)

1 MySQL触发器插入null而不是值

我在理解触发器如何在MySQL中执行时遇到了麻烦,而且我一头撞墙,因为我似乎无法找出为什么它不起作用。 我有以下触发 但是,它使用null而不是正确的值填充我的行。 但是,将其放在选择查询中会得到正确的值。 IE: 我尝试将其放在AFTER INSERT触发器中,但这导 ...

5 如何使用触发器检查mysql中的数据行?

我想确定的是,我的数据表中没有孩子的孩子。 因此,如果我有一个父项A和一个子项B(B.parent = A),并且我尝试将子项C插入到项目B(C.parent = B),则此触发器必须防止它发生,并且将C的parent_id设置为A(C.parent = A)。 我的桌子(父母-孩子)只需要 ...

7 MYSQL触发器:选择行中具有更新值的列

我有这个触发器的问题。 我想仅在列“确认”已更新为“ 1”值的情况下选择刚刚更新的行的两列值。 这是错误消息:结果由多个行组成。 非常感谢。 ...

2016-11-29 14:13:25 0 29   mysql
8 如何根据MySQL更新触发器中的行值计算值?

我有一个有三排的桌子。 当更新前两行中的任何一行中的值时,我想触发对row3中的值的更新。 这大致是我希望实现的逻辑(伪代码): 我如何将其构建为SQL触发器,或者,如果不这样做,在更新前两行的PHP代码中构建等效逻辑? ...

9 mysql触发器的帮助(在插入之前检查值)

嗨,我是mysql的新手,我试图弄清楚如何使用触发器。 我想做的是:我有2个表,max和sub_max,当我向sub_max插入新行时,我想检查具有与新行相同的foreign_key的值的总和是否小于最大表格。 我认为这听起来令人困惑,所以这是我的桌子: 这是我的触发器代码,我知 ...

10 插入值检查前的MySQL触发器

我有一个office专栏的staff 。 目前office列不接受NULL值。 持久存在此表上的应用程序有一个错误,这意味着,当工作人员尚未分配办公室时,它会尝试在表上插入NULL值。 我被要求使用触发器拦截插入到Staff表上的插入,并检查office值是否为NULL并将其替换为值N ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM