我正在将一些CREATE TABLE查询从MySQL转换为Postgres,并且遇到了在不同表上创建具有相同名称的多个键(又名索引)的问题。
例如,在MySQL中,您可以拥有多个包含相同索引创建语法的CREATE TABLE查询:KEY OrgId
(SiteId
) - 请参阅本文底部的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 ;
答案 0 :(得分:1)
最简单的方法是根本不指定名称(例如" CREATE INDEX ON Pages(SiteId)"); Postgres将构成一个独特的名称。否则自己编造不同的名称(例如" CREATE INDEX idx_Pages_SiteId ON ...")
答案 1 :(得分:0)
正如Craig所说,索引仅在内部用于数据库,因此索引名称并不重要 - 但在PostgreSQL中它们必须是唯一的。