InnoDBに移行するための外部キーの設定についてサポートが必要です。状況は、私が3つのテーブルを持っているということです:仕事、顧客、連絡先。
ジョブは顧客に属し、ジョブは連絡先に属します。顧客には多くの仕事があり、多くの連絡先があります。連絡先は顧客に属し、多くのジョブがあります。選択した顧客に属する連絡先のみを挿入できるように、ジョブテーブルに外部キーを設定するためのサポートが必要です。(つまり、顧客Aに連絡先A1とA2があり、顧客Bに連絡先B1がある場合、ジョブの顧客として顧客Aを選択すると、A1またはA2以外の連絡先のエントリは拒否されます)。これは外部キーで行うことができますか、それとも選択したプログラミング言語で検証を行う必要がありますか?
これが私のスキーマです:
CREATE TABLE jobs(
job_id INT(11) NOT NULL AUTO_INCREMENT,
customer_id INT(11) DEFAULT NULL,
contact_id INT(11) DEFAULT NULL,
job_number INT(11) UNSIGNED NOT NULL DEFAULT 0,
status_void TINYINT(1) DEFAULT 0,
PRIMARY KEY (job_id),
INDEX active_jobs (job_number, status_void),
INDEX customer_id (customer_id),
UNIQUE INDEX job_number (job_number),
CONSTRAINT FK_jobs_contacts_contact_id FOREIGN KEY (contact_id)
REFERENCES contacts (contact_id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT FK_jobs_customers_customer_id FOREIGN KEY (customer_id)
REFERENCES customers (customer_id) ON DELETE SET NULL ON UPDATE CASCADE
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;`
CREATE TABLE customers(
customer_id INT(11) NOT NULL AUTO_INCREMENT,
inactive TINYINT(1) DEFAULT 0,
customer_name VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (customer_id),
UNIQUE INDEX customer_name (customer_name),
INDEX inactive (inactive)
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;
CREATE TABLE contacts(
contact_id INT(11) NOT NULL AUTO_INCREMENT,
customer_id INT(11) DEFAULT NULL,
inactive TINYINT(1) DEFAULT 0,
first_name VARCHAR(50) DEFAULT NULL,
last_name VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (contact_id),
UNIQUE INDEX contact_key (customer_id, last_name, first_name),
INDEX customer_id (customer_id),
INDEX inactive (inactive),
INDEX name (last_name, first_name),
CONSTRAINT fk_contacts_customers_customer_id FOREIGN KEY (customer_id)
REFERENCES customers (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;
私が持っているもう1つの目標は、無効ではないすべてのジョブ(status_void = 0)と非アクティブではないすべての顧客と連絡先(inactive = 0)を一覧表示するようにインデックスを設定することです。この場合、複数列のインデックス(ジョブ)または2つの個別のインデックス(顧客/連絡先)が役立つかどうかはわかりません。
私はまだ学んでいるので、気楽にやってください。お時間をいただきありがとうございます。