PostgreSQL 9.2。次のテーブルには、2 つのバリエーションのレコードを格納できます。alarmConfigurations
NOT NULL のエントリac_p_id
は複数回存在できますが、NULL のエントリは 1ac_p_id
回だけ存在する必要があります (したがって、ac_unique_row_no_port
制約があります)。
ご覧のとおり、通常のインデックスは他のすべての外部キーに作成され、これらは頻繁にスキャンされます。しかし、ac_p_id
...
ac_index_p_id
IS NOT NULL を使用して一意ではない制約を作成することに特に利点はありますか(他のように指定しないのではなく)?- 実際、私が作成した場合、それは NOT NULL
ac_unique_row_no_port
のスキャンにも使用されますか?ac_p_id
前もって感謝します。
CREATE TABLE alarmConfigurations (
ac_id SERIAL PRIMARY KEY,
ac_ad_code TEXT NOT NULL,
ac_ad_et_code TEXT NOT NULL,
ac_e_id INTEGER NOT NULL,
ac_as_code TEXT,
ac_p_id INTEGER,
ac_details HSTORE, -- extra configuration
CONSTRAINT ac_ad_fkey FOREIGN KEY (ac_ad_code, ac_ad_et_code)
REFERENCES alarmDefinitions (ad_code, ad_et_code)
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT ac_as_code_fkey FOREIGN KEY (ac_as_code)
REFERENCES alarmSeverities (as_code)
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT ac_e_id_fkey FOREIGN KEY (ac_e_id)
REFERENCES entities (e_id) ON DELETE CASCADE,
CONSTRAINT ac_p_id_fkey FOREIGN KEY (ac_p_id)
REFERENCES ports (p_id) ON DELETE CASCADE
);
CREATE INDEX ac_index_e_id ON alarmConfigurations(ac_e_id);
CREATE INDEX ac_index_ad_code ON alarmConfigurations(ac_ad_code);
CREATE INDEX ac_index_ad_et_code ON alarmConfigurations(ac_ad_et_code);
CREATE INDEX ac_index_p_id ON alarmConfigurations(ac_p_id)
WHERE ac_p_id IS NOT NULL;
CREATE UNIQUE INDEX ac_unique_row_no_port
ON alarmConfigurations(ac_ad_code, ac_ad_et_code, ac_e_id)
WHERE ac_p_id IS NULL;