0
CREATE TABLE preferences(
    user_id INT,
    hot_sid INT,
    not_sid INT,
)Engine = InnoDB;


CREATE TRIGGER check_show_comparison
AFTER INSERT ON preferences
REFERENCING NEW ROW
FOR EACH ROW
WHEN ( hot_sid = not_sid )
ROLLBACK TRANSACTION;

そのため、MYSQLを使用してデータベースをセットアップして、ホットかどうかに似たものを追跡しようとしています。実際の目的はそれほど重要ではありませんが、基本的には、3 つの列を持つ設定と呼ばれるテーブルがあります。最初の列はユーザ​​ー ID で、2 番目と 3 番目の列は同じ種類のオブジェクトを表す設定 ID です。(ホットまたはノットの例では、hot_sid は「ホット」エンティティの ID を格納し、not_sid は「ノット」エンティティの ID を格納します。これら 2 つのエンティティは同じタイプです)。

テーブルへの挿入ごとにトリガーを書き込んで、誰かがホットとそうでないのと同じsidを持つ行を追加できないようにしようとしています。このチェック制約を実装するときに何が間違っていますか? チェック制約を使用することだけを考えましたが、MYSQL で実際に強制されているとは思いません。

ご協力ありがとうございました!

4

1 に答える 1

0

その通りです。チェック制約は MySQL の DDL でサポートされていますが、無視されます。リファレンスから - CHECK 句は解析されますが、すべてのストレージ エンジンによって無視されます

解決策は、BEFORE INSERT トリガーを作成し、新しい値をチェックして、必要に応じてトリガーからエラーをスローすることです。

エラーを発生させるには、次を使用できます。

  • SIGNAL ステートメント:SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'hot_sid = not_sid';
  • 存在しないストアド プロシージャを呼び出します。CALL proc_error();
于 2012-10-18T06:21:21.240 に答える