[英]MySQL Trigger checking for existing rows with possible NULL values
我有一个InnoDB表,在performance_id
, ticket_rank_id
和ticket_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_id
和NEW.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.