繁体   English   中英

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

[英]MySQL Trigger checking for existing rows with possible NULL values

我有一个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?

您需要为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如何中止插入。 但这是一个不同的问题。

不管怎么说,多谢拉 ;)

暂无
暂无

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

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