我有一些源语法需要从MySQL转换为postgreSQL。似乎在postgres中没有类似的东西可以在单个表上生成多个索引。另外,我很难理解为什么会在一个表上生成多个索引:
ALTER TABLE concept
ADD PRIMARY KEY (table_id),
ADD UNIQUE INDEX idx_table_table_id (table_id),
ADD INDEX idx_table_code (table_code),
ADD INDEX idx_table_v_id (v_id),
ADD INDEX idx_cd_id (d_id),
ADD INDEX idx_table_class_id (table_class_id);
有什么想法吗?
答案 0 :(得分:0)
您可以将其分解为单独的语句。还要注意,创建主键将在该列上隐式创建一个唯一索引,因此您也不应尝试显式创建一个主键:
ALTER TABLE concept ADD PRIMARY KEY (table_id);
ALTER TABLE concept ADD INDEX idx_table_code (table_code);
ALTER TABLE concept ADD INDEX idx_table_v_id (v_id);
ALTER TABLE concept ADD INDEX idx_cd_id (d_id);
ALTER TABLE concept ADD INDEX idx_table_class_id (table_class_id);
答案 1 :(得分:0)
在PostgreSQL中,每个约束是单独添加的。参见ALTER TABLE。
您的单个DDL(数据定义语言)语句需要细分为:
约束根据规则对数据进行检查:
ALTER TABLE concept ADD PRIMARY KEY (table_id);
索引对于加快某些查询非常有用。小心使用:
CREATE INDEX idx_table_code ON concept (table_code);
CREATE INDEX idx_table_v_id ON concept (v_id);
CREATE INDEX idx_cd_id ON concept (d_id);
CREATE INDEX idx_table_class_id ON concept (table_class_id);
注意:仅在需要时创建索引。我的(非常个人的)经验法则是每张桌子不超过10。如果达到那个水平,那么我需要仔细考虑一下我在做什么。
答案 2 :(得分:0)
正如前面提到的那样,您应该为每个索引创建一个CREATE INDEX语句。
关于表上的多重索引...问题在于,有时单个表上的查询可能非常不同。在您的示例中,使用基于table_code列或基于d_id列的谓词创建sql并不相同。
这就是为什么有时更好的方法是同时为两者创建索引。似乎为两个列创建一个索引更容易,更好,但是您应该认为索引列的顺序非常重要,如果两个列的值都很多,则更重要。同样,table_code或d_id列也不一定总是在SQL上。