この質問に答えるために、トリガーを使用してクロステーブルの整合性制約をチェックすることを提案しました。コメントで、問題を引き起こす可能性があることが示唆されています。
クロス行チェックを行うトリガーは、ほとんどのデータベースでほとんど機能しません...他のトランザクションからコミットされていない行を読み取ることができないためです
ただし、この主張を裏付ける情報源は見つかりませんでした。公式 ドキュメントには何も言及されていません。私が見つけた他の問題はSO でここでカバーされています- トリガーが一目で見えないので、潜在的な隠された複雑さを主に批判しています。しかし、最高評価の回答でさえ、整合性の問題への使用を認めています。
私の質問は次のとおりです。データベース トリガーはクロス テーブル整合性制約に対して安全ですか? 具体的には、以下の解決策は機能しますか?
元の質問を要約します。テーブルがあります
- プレーヤー - PlayerID、PlayerName
- ベット - BetID、BetName
- plays_in - BetID、PlayerID
制約は、BetName と PlayerID の組み合わせが一意であることです。推奨されるトリガーの定義:
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//