将具有重复名称的MySQL索引转换为PostgreSQL

时间:2014-06-07 02:00:09

标签: mysql sql postgresql indexing

我正在将一些CREATE TABLE查询从MySQL转换为Postgres,并且遇到了在不同表上创建具有相同名称的多个键(又名索引)的问题。

例如,在MySQL中,您可以拥有多个包含相同索引创建语法的CREATE TABLE查询:KEY OrgIdSiteId) - 请参阅本文底部的MySQL示例。

在Postgres中我明白你不能在CREATE TABLE查询中定义索引,所以我运行两个单独的Postgres查询来定义索引:

CREATE INDEX OrgId ON MenuTypes USING btree (SiteId);
CREATE INDEX OrgId ON Pages USING btree (SiteId);

当第一个CREATE INDEX查询正在运行时,第二个查询无法运行,因为索引名称是重复的。 (错误:关系“orgid”已经存在)

有没有人对如何解决这个问题有任何想法?


以下是我尝试转换为Postgres的两个MySQL查询:

CREATE TABLE IF NOT EXISTS `MenuTypes` (
  `MenuTypeId` int(11) NOT NULL AUTO_INCREMENT,
  `MenuTypeUniqId` varchar(50) NOT NULL,
...
  `SiteId` int(11) NOT NULL,
...
   PRIMARY KEY (`MenuTypeId`),
   KEY `OrgId` (`SiteId`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;


CREATE TABLE IF NOT EXISTS `Pages` (
  `PageId` int(11) NOT NULL AUTO_INCREMENT,
  `PageUniqId` varchar(50) NOT NULL,
...
  `SiteId` int(11) NOT NULL,
...
  `Created` datetime NOT NULL,
  PRIMARY KEY (`PageId`),
  KEY `OrgId` (`SiteId`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=457 ;

2 个答案:

答案 0 :(得分:1)

最简单的方法是根本不指定名称(例如" CREATE INDEX ON Pages(SiteId)"); Postgres将构成一个独特的名称。否则自己编造不同的名称(例如" CREATE INDEX idx_Pages_SiteId ON ...")

答案 1 :(得分:0)

正如Craig所说,索引仅在内部用于数据库,因此索引名称并不重要 - 但在PostgreSQL中它们必须是唯一的。