1

次の表を検討してください。

CREATE TABLE `demo` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `from_val` BIGINT(20) DEFAULT NULL,
  `to_val` BIGINT(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

同じテーブルに、from_val または to_val別のレコードのfrom_valとの間に 2 番目のレコードが存在しないようにする制約を作成することはできto_valますか? したがって、空のテーブルからの 2 番目のクエリは、制約エラーで失敗するはずです。

INSERT INTO `demo` (`from_val`, `to_val`) VALUES (1,10),(11,20);
INSERT INTO `demo` (`from_val`, `to_val`) VALUES (5,15);

途中でデータを検証する/更新するのは些細なことですが、MySQL がこれを RDBMS レベルで強制できるかどうかを知りたかっただけです。

4

1 に答える 1

2

いいえ、MySQLは、指定した条件で例外を発生させる宣言型制約をサポート(または強制)しません。

タプルの値(「2番目のクエリ」)は、少なくともMySQLの宣言型制約に使用できるものに関しては、(5,15)以前にテーブルに挿入された行の値と競合しません。(1,10),(11,20)

回避策は、テーブルで定義BEFORE INSERTしてトリガーすることです。BEFORE UPDATEそれらは必要なチェックを実行し、例外を発生させることができます。

于 2012-09-12T20:54:52.157 に答える