Я предложил использовать триггер, чтобы проверить ограничение целостности кросс-таблицы, отвечая на этот вопрос. В комментариях было высказано мнение, что это может вызвать проблемы:
Триггеры для проверки перекрестных строк редко работают в большинстве баз данных... потому что они не могут читать незафиксированные строки из других транзакций.
Я не нашел ни одного источника, поддерживающего заявку. Официально документация ничего не говорит. Другие проблемы, которые я нашел, рассматриваются здесь на SO - это в основном критикует потенциальную скрытую сложность, поскольку триггеры не видны с первого взгляда. Ставка даже на самый высокий рейтинг позволяет использовать их для проблем с целостностью.
Итак, мой вопрос: Являются ли триггеры базы данных безопасными для ограничений целостности кросс-таблицы? В частности, будет ли решение ниже работать?
Подвести исходный вопрос. У нас есть таблицы
- Player - PlayerID, PlayerName
- Ставка - BetID, BetName
- play_in - BetID, PlayerID
Ограничение на то, чтобы комбинация BetName и PlayerID sholud была уникальной. Определение предлагаемого триггера:
CREATE TRIGGER check_bet_name BEFORE INSERT ON plays_in
FOR EACH ROW BEGIN
DECLARE bet_exists INT DEFAULT 0;
DECLARE msg VARCHAR(255);
SELECT 1 INTO bet_exists
FROM Bet AS b1
WHERE b1.BetID = NEW.BetID
AND EXISTS (SELECT *
FROM plays_in AS p JOIN Bet AS b2 USING (BetID)
WHERE p.PlayerID = NEW.PlayerID AND b2.BetName = b1.BetName
)
LIMIT 1;
IF bet_exists THEN
SET msg = "Bet name already exists...";
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
END//