1

テーブルを考えてみましょう

Video(
    IDvideo(PK),
    Date,
    Description,
    User
)

mysqlでは、アサーションを作成する方法がありません。1つ以上のトリガーを使用して次のアサーションをシミュレートすることは可能ですか?

create assertion asser1  
check (0 = 
    ( select count(*)  
      from Video  
      where Date >= DATE_SUB(current_date(),INTERVAL  1 YEAR ) 
          && Date<=current_date()  
      group by User   
      having count(*) > 200
    )
)

そのトリガーをどのように書くべきですか?

4

1 に答える 1

1

STOP ACTION問題は、MySQLにコマンドに相当するものがないことです。したがって、基本的に、回避策はかなり汚いです:

1つの方法は、トリガー内の制約に違反してエラーをバブルし、挿入をキャンセルできることです。

CREATE TABLE stop_action (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(35),
    UNIQUE KEY (id, name)
);
INSERT INTO stop_action (1, 'Assert Failure');

次に、トリガーで、次のことを試してください。

INSERT INTO stop_action (1, 'Assert Failure');

その利点は、返されるエラーが重複キーエラーになり、テキストに「AssertFailure」が含まれることです。

したがって、トリガーは次のようになります。

delimiter |

CREATE TRIGGER asser1_before BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    SELECT count(*) INTO test FROM (select count(*)
          from Video  
          where Date >= DATE_SUB(current_date(),INTERVAL  1 YEAR ) 
            && Date<=current_date()  
          group by User   
          having count(*) > 200);
    IF test != 0 THEN
        INSERT INTO stop_action (1, 'Assert Failure');
    END IF;
  END;
|

delimiter ;

さて、前にもこれを行う必要がありますUPDATE。そうしないと、日付を無効な状態に更新する可能性があります。しかしそうでなければ、それは少なくともあなたが始めるはずです...

于 2011-02-01T19:31:59.380 に答える