MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

トリガーを使用してCHECKCONSTRAINTをエミュレートするにはどうすればよいですか?


MySQLは参照整合性のために外部キーをサポートしていますが、CHECK制約はサポートしていません。ただし、トリガーを使用してそれらをエミュレートできます。以下に示す例を使用して説明できます-

次のように、2文字、ダッシュ、3桁、ダッシュ、2文字のような修正構文登録番号を持つことができる「car」という名前のテーブルがあるとします-

mysql> Create table car (number char(9));
Query OK, 0 rows affected (0.32 sec)

mysql> Insert into car values('AB-235-YZ');
Query OK, 1 row affected (0.10 sec)

上記の値は有効な値ですが、次のクエリで挿入する値についてはどうでしょうか。

mysql> insert into car values('AB-2X5-YZ');
Query OK, 1 row affected (0.04 sec)

上記の値は、使用している固定構文に反する数字の間に文字が含まれているため、有効な値ではありません。

値を挿入するためのCHECKCONSTRAINTをエミュレートするBEFOREINSERTトリガーを作成する-

これで、このような挿入を防ぐために、次のようにトリガーを作成できます-

mysql> delimiter //
mysql> create trigger car_insert_value before insert on car
    -> for each row
    -> begin
    -> if new.number not rlike '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$'
    -> then
    -> signal sqlstate '45000' set message_text = 'Not a valid Number';
    -> end if;
    -> end //
Query OK, 0 rows affected (0.15 sec)

mysql> Delimiter ;
mysql> Delete from car;
Query OK, 2 rows affected (0.06 sec)

ここで、間違った番号を挿入しようとすると、上記で作成されたトリガーによってその挿入が停止され、次のようなエラーがスローされます-

mysql> insert into car values('AB-2X5-YZ');
ERROR 1644 (45000): Not a Valid Number

ただし、次のように有効な値を挿入できます-

mysql> insert into car values('AB-235-YZ');
Query OK, 1 row affected (0.04 sec)

値を更新するためのCHECKCONSTRAINTをエミュレートするBEFOREUPDATEトリガーを作成する-

ここで、テーブルを誤った値で更新しようとした場合、MySQLは次のようにそれを停止するつもりはないとします。

mysql> update car set number='AB-2X5-YZ';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0

上記のクエリにより、テーブル「car」の誤った値が更新されました。次のクエリでは、BEFORE UPDATEトリガーを作成します。これにより、テーブル内の誤ったデータを更新できなくなります-

mysql> delimiter //
mysql> create trigger car_update_value before update on car
    -> for each row
    -> begin
    -> if new.number not rlike '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$'
    -> then
    -> signal sqlstate '45000' set message_text = 'Not a valid number';
    -> end if;
    -> end //
Query OK, 0 rows affected (0.11 sec)

mysql> Delimiter ;

mysql> update car set number='AB-2X5-YZ';
ERROR 1644 (45000): Not a valid number

  1. MySQLのテーブルにチェック制約を追加するにはどうすればよいですか?

    テーブルにチェック制約を追加するには、最初にテーブルを作成しましょう。 CREATE table yourTableName (    Column_name1 datatyep,    .    .    .    .    Column_name N datatype,    check( condition) ); 以下は、チェック制約を作成して年齢をチェックする方法です。 check(Age>=45) ここでテーブルを作成し、テーブルを作

  2. MySQLのバージョンを確認する方法

    ユーザーが現在実行しているMySQLのバージョンを確認する方法を理解しましょう- コンソールでクエリを入力する前に、ユーザーがサーバーに接続していることを確認することが重要です。 MySQLのバージョンを確認する 以下のクエリは、使用されているサーバーのバージョン番号と現在の日付を示します。 mysql> SELECT VERSION(), CURRENT_DATE; 注: 関数「VERSION()」および「CURRENT_DATE」は大文字と小文字を区別しません。これは、「version()」、「Version()」、「vERsion()」を意味し、すべて同じ意味です。同じことが