2

現在のスキーマが次のアプリケーションにテーブルがあります。

CREATE TABLE quotes
(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  quote_request_id INT UNSIGNED NOT NULL,
  quote_amount DECIMAL(12, 2) NOT NULL,
  accepted TINYINT UNSIGNED NOT NULL DEFAULT 0,
  FOREIGN KEY (quote_request_id) REFERENCES quote_requests(id)
) Engine=InnoDB;

特定の見積もりリクエストに対して1つの見積もりの​​みを受け入れることができるように制約を適用したい-つまり、同じquote_request_id値を持つ2つ以上の行のaccepted値が1.1。

これはMySQLで可能ですか?外部キー、主キー以外の列の一意性などの強制は正常に機能し、UNIQUE制約を複数の列に適用することに関する情報は見つかりますが、複数の列を含むより複雑な制約については何も見つかりません。

4

3 に答える 3

1

トリガーなしでこれを行う場合は、受け入れられた見積もりの​​みが保存される別のテーブルを追加し、テーブルacceptedから列を削除できます。quotes

CREATE TABLE quotes
(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  quote_request_id INT UNSIGNED NOT NULL,
  quote_amount DECIMAL(12, 2) NOT NULL,
  --- accepted TINYINT UNSIGNED NOT NULL DEFAULT 0,             --- removed
  FOREIGN KEY (quote_request_id) REFERENCES quote_requests(id)
  UNIQUE KEY (quote_request_id, id)               --- needed for the FK below
) Engine=InnoDB;

CREATE TABLE quotes_accepted
(
  id INT UNSIGNED NOT NULL PRIMARY KEY,
  quote_request_id INT UNSIGNED NOT NULL,
  UNIQUE KEY (quote_request_id),            --- this ensures there is only one
                                            --- accepted quote per request
  FOREIGN KEY (quote_request_id, id) 
    REFERENCES quotes(quote_request_id, id)
) Engine=InnoDB;
于 2012-07-23T08:22:13.387 に答える
0

a_horse_with_no_name から回答がありましたが、コメントに記載されているため、受け入れられません。

「MySQL は部分インデックスをサポートしていないため、MySQL のトリガーに戻さない限り、これは不可能だと思います。」

于 2012-07-23T08:11:58.767 に答える
0

UNIQUEつまり、次のようなものが必要です。

UNIQUE `quote_accepts` (`quote_request_id`, `accepted`)

quote_request_idここで、 &の繰り返しペアのaccepted場合、INSERTは失敗します。

于 2012-07-13T08:42:05.350 に答える