【发布时间】:2013-09-11 13:53:27
【问题描述】:
PostgreSQL 9.2。下表中可以存储两种不同的记录。 alarmConfigurations 条目其中ac_p_id 不为NULL 可以存在多次,但那些ac_p_id 为NULL 的条目只能存在一次(因此ac_unique_row_no_port 约束)。
如您所见,常规索引是在所有其他外键上创建的,这些外键会被大量扫描。但是对于ac_p_id...
- 使用 IS NOT NULL 创建非唯一约束
ac_index_p_id是否有任何特别的优势(而不是像其他约束一样不指定)? - 事实上,如果我只创建
ac_unique_row_no_port,它是否也可以用于ac_p_id不为NULL 的扫描?
提前致谢。
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;
【问题讨论】:
标签: sql postgresql