我有一个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?
答案 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
如何中止插入。但这是一个不同的问题。
非常感谢;)