2

MySQL データベースをセットアップしようとしています。最終的なデータベースは、約で構成されます。7 つのテーブルに分散された 200 列。今、ほとんどの列にチェック制約を追加したいという問題があります。制約が 1 つしかない列もあれば、制約が多数ある列や、異なるテーブルの列の影響を受ける列もあります。

たとえば、年齢が 20 歳以上である場合、または郵便番号が 5 文字で構成され、1 で始まる場合、または入院日 (入院テーブル) が退院日 (退院テーブル) より前である場合にのみ、行をテーブルに追加できます。 . 例を3つだけ。あと 1000 個考えられますが、これが私の問題です。

これらの制約をより構造化された方法で追加したいと思います。10 個を超える制約を持つトリガーは複雑になり、作成者以外の誰もすべての制約を再構築できなくなります。しかし、データベースが何年も使用される場合、多くの管理者がデータベースを操作して、新しい制約を追加したり、不要な制約を削除したりする必要があります。

DELIMITER $$
CREATE TRIGGER `test``_before_insert` BEFORE INSERT ON `zip`
FOR EACH ROW

BEGIN
    IF NEW.zip_id < 5 THEN
        SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint 1';
    END IF;

    IF NEW.zip_id = 5 THEN
        SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint 2';
    END IF;
END $$

DELIMITER ;

それが私が問題を処理したくない方法です。 

私の質問は、通常の人間が読める方法で制約を宣言し (たとえば、テキストファイルごとに適切な名前の制約を 1 つ)、これらをデータベースに追加する方法があるかどうかです。

4

2 に答える 2

0

Unfortunately, the check constraint in MySQL does not work. You can learn more at this SO question. Even the accepted answer for this question suggests the use of triggers.

You are on the right track when you decided to use triggers. However you have a few misconceptions.

A trigger is basically defined on an event on a table. As you have 7 tables, you will have 7 separate triggers per table, at least. Read more about triggers in MySQL at MySQL Reference Manual.

It is you and you only that has to find ways to keep the code well organized so that your teammates and even you can understand it well. Everything that you need to do is follow the best practices followed across the software industry. For a few hints you can refer here and here on dba.stackexchange.com.

于 2013-04-12T15:01:05.990 に答える
0

私は自分の問題について考え直しましたが、トリガーの制約のチェックについて別の議論と解決策があります。まず、引数: データをチェックするには、おそらく少なくとも BEFORE INSERT および BEFORE UPDATE トリガーが必要です。どちらのトリガーもほぼ同じです。時間の経過とともに制約が変更された場合、変更を両方のトリガーに送信する必要があります。そうしないと、データの一貫性が失われる可能性があります。INSERT および UPDATE トリガーで呼び出すことができる 1 つの制約を実装するためのストアド プロシージャを考えました。手順を変更すると、両方のトリガーに影響します。

DROP TRIGGER IF EXISTS test_before_insert;
DROP PROCEDURE IF EXISTS `procedureLess5`;
DROP PROCEDURE IF EXISTS `procedureEquals5`;

DELIMITER $$

CREATE PROCEDURE `procedureLess5` (IN myInput INT)
BEGIN
    IF myInput < 5 THEN
        SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint 1';
    END IF;
END $$

CREATE PROCEDURE `procedureEquals5` (IN myInput INT)
BEGIN
    IF myInput = 5 THEN
        SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint 2';
    END IF;
END $$

CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `zip`
FOR EACH ROW
BEGIN
    CALL procedureLess5(NEW.zip_id);
    CALL procedureEquals5(NEW.zip_id);
END $$

DELIMITER ; 

これはチャンスですか?呼び出されるプロシージャが 20 を超える場合、データベースのパフォーマンスはどうなりますか?

それとも別の方法を考えますか?私はMySQLに固執しているのではなく、PostgreSQLもチャンスです。PostgreSQLでCHECK CONSTRAINSを使用する方が良い/速い/標準ですか?

于 2013-04-15T11:45:44.873 に答える