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

时间:2012-09-13 09:22:13

标签: mysql database triggers

我有一个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 个答案:

答案 0 :(得分:1)

您需要为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);

答案 1 :(得分:0)

我想我明白了:

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

非常感谢;)