1

私のテーブルは次のとおりです。

CREATE TABLE IF NOT EXISTS PHONES (
    number VARCHAR(10),
    id INT,
    type VARCHAR(10),
    PRIMARY KEY (number),
    FOREIGN KEY (id)
        REFERENCES TECHNICIANS(id)
        ON DELETE CASCADE
) ENGINE = INNODB;

IDごとに1つの主要連絡先番号を指定したいと思います。ブール列を追加することを考えていましたが、1つにつき1つの「真の」値のみを許可するようにする方法がわかりません。id。

4

3 に答える 3

2

TECHNICIANSからPHONESに外部キーを追加します。

ALTER TABLE TECHNICIANS
  ADD COLUMN primary_number VARCHAR(10),
  ADD CONSTRAINT FOREIGN KEY (primary_number) REFERENCES PHONES (number)
    ON UPDATE CASCADE
    ON DELETE SET NULL;

これにより、周期的な参照が作成されます。技術者は電話を参照し、電話は技術者を参照します。これは問題ありませんが、テーブルの削除、バックアップの復元などを行う場合は、特別な処理が必要です。

于 2010-08-16T23:41:45.240 に答える
1

基本的に3つのオプションがあります...

  1. ブール列がありますが、それを維持するのはアプリケーション次第です
  2. 整数を持っているので、優先度(0 =プライム、1 =セカンダリ、2 =ターシャリ、...)を保存します。これも維持する必要があります。
  3. 親子関係があるため、親(技術者?)レコードには複数の子(電話番号)レコードがあります。親レコードには、プライマリ子レコードのIDも含まれます。唯一の欠点は、レコードの追加が多段階になるか(技術者の追加、電話番号の追加、技術者の主要な電話番号の設定)、またはそれを行うスマートDALが必要になることです:)

ちなみに、実際には、PhoneIdごとではなく、TechnicianIdごとに1つの素数を意味していると思います。

于 2010-08-16T23:37:28.603 に答える
1

MySQLの「抜け穴」を使用します。MySQLのドキュメントには次のように書かれています。

UNIQUEインデックスは、インデックス内のすべての値が異なる必要があるような制約を作成します。既存の行と一致するキー値を持つ新しい行を追加しようとすると、エラーが発生します。この制約は、BDBストレージエンジンを除いてNULL値には適用されません。他のエンジンの場合、UNIQUEインデックスは、NULLを含む可能性のある列に複数のNULL値を許可します。

これは、true(または1)とNULLの2つの値を持つブール列を作成できることを意味します。その列とキーの上にUNIQUEインデックスを作成します。これにより、1つのレコードのみをtrueに設定できますが、任意の数のレコードにNULLを設定できます。

于 2010-08-16T23:59:15.533 に答える