2

この問題で私を助けてくれますか? MySQLデータベースに 2 つのテーブルがあります。

ServiceProvider(SPID, Name, ... etc.)
hasTag(SPID, TagID)

各サービス プロバイダーには、少なくとも 1 つのタグ、最大 5 つのタグが必要です。max-constraint は問題ありませんが、min-constraint は適切に機能しません。MySQL最初にアサーションを介してこれを実装しようとしましたが、アサーションをサポートしていないことがわかりました。したがって、次のトリガーを作成しました。

delimiter |

CREATE  TRIGGER MinTags BEFORE INSERT
        ON ServiceProvider
        FOR EACH ROW BEGIN
            IF EXISTS (SELECT SPID FROM ServiceProvider
                       WHERE NOT EXISTS (SELECT DISTINCT SPID FROM hasTag))
            THEN INSERT INTO stop_action VALUES(1, 'Assert Failure');
            END IF;
        END;
|

delimiter ;

'Assert Failure'テーブルへの挿入はstop_action、制約違反を作成するためだけであるため、DB はアクションを中止します。

さて、通常、ServiceProviderテーブルに何も挿入せずにテーブルに値を挿入するhasTagと、エラーが発生するはずですよね? ServiceProviderしかし、どういうわけかうまくいきません...エラーを受け取ることなく、必要なものをテーブルに挿入できます。私のコードの何が問題なのか知っていますか?

4

2 に答える 2

1

記述されているように、このトリガーは挿入される行の値を使用しません。

SPID列の値を取得するための構文は次のとおりです。

NEW.SPID

また、SIGNALステートメントを使用してエラーを発生させることを検討してください。

SQLでASSERTを使用する場合は、この投稿が役立つ場合があります。

SQLスクリプト-#defineに相当するものは存在しますか?

于 2012-11-12T08:58:26.080 に答える
1

少し非正規化するのはどうですか:

ALTER TABLE ServiceProvider
  ADD COLUMN TagID1 BIGINT UNSIGNED NOT NULL,
  ADD COLUMN TagID2 BIGINT UNSIGNED NULL,
  ADD COLUMN TagID3 BIGINT UNSIGNED NULL,
  ADD COLUMN TagID4 BIGINT UNSIGNED NULL,
  ADD COLUMN TagID5 BIGINT UNSIGNED NULL;

必要に応じて、外部キー制約を含めます。

于 2012-11-11T22:46:47.777 に答える