Я предложил использовать триггер, чтобы проверить ограничение целостности кросс-таблицы, отвечая на этот вопрос. В комментариях было высказано мнение, что это может вызвать проблемы:
Триггеры для проверки перекрестных строк редко работают в большинстве баз данных... потому что они не могут читать незафиксированные строки из других транзакций.
Я не нашел ни одного источника, поддерживающего заявку. Официально документация ничего не говорит. Другие проблемы, которые я нашел, рассматриваются здесь на 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//
