3

performance_idticket_rank_idおよびに一意のインデックスを持つ InnoDB テーブルがありticket_type_idます。

これらの ID はすべて他のテーブルと関係がありますが、それらの値はNULL. 列の値の 1 つが 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

問題は、 NULL か値があるかAND ticket_rank_id = NEW.ticket_rank_idを確認する必要があるところです。ticket_rank_id

AND ticket_rank_id = NULL動作しません。動作する場合にのみ動作しますAND ticket_rank_id IS NULL

これに対する巧妙な解決策はありますか、または NULL であるかどうかに応じて個別のクエリを作成する必要がNEW.ticket_rank_idありますか?NEW.ticket_type_id

4

2 に答える 2

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。しかし、それは別の問題です。

とにかく、ありがとう ;)

于 2012-09-13T10:08:10.377 に答える