postgresql:如何重命名架构中的表


76

我正在使用PostgreSQL 9.x,我想重命名一个表。此SQL代码:

CREATE TABLE new (id int);
ALTER TABLE new RENAME TO old;
DROP TABLE old;

正确重命名表。但是这个SQL代码:

CREATE SCHEMA domain;
CREATE TABLE domain.old (id int);
ALTER TABLE domain.old RENAME TO domain.new;

失败,出现错误:

错误:“或”附近的语法错误。

“。” 下划线是“域”和“新”之间的一个


8
有用的问题(和答案),但将新名称重命名为旧声音:)
dwanderson

是的,这是正确的,应该读取domain.genuine而不是domain.new,然后读取domain.new而不是domain.old...。
com16年

Answers:


136

一种方法是:

ALTER TABLE domain.old RENAME TO new

另一种方式:

SET search_path TO domain;
ALTER TABLE old RENAME TO new;

的文档search_path


1
thx可以用于通用目的,但是我当前的情况要复杂一些...重构后包含具有唯一名称的命名表,我想将domain.users重命名为domain.user!使用SET,我必须将ALTER TABLE用户RENAME写入“ user”;但“”或[]表示法都无法与RENAME TO一起使用...在这两种情况下,我都出现语法错误。
comte 2015年

@comte添加了另一种解决方案,即一种衬垫(与原始衬垫相同,只是不指定旧模式,它将保持不变)
Bohuslav Burghardt

您的一个班轮可以完美地与任何非保留表名一起使用。同样,它不适用于'或[]之间的保留关键字
-comte

3
@comte:由SQL标准要求标识符的双引号,这是在手动据可查:postgresql.org/docs/current/static/...不知道为什么你会发现suprising
a_horse_with_no_name

4
如果您有时间争论,则应在我的评论中阅读我也尝试使用方括号,在其他一些SQL引擎(至少是MS产品,例如SQL Server)上的惯例,以及单引号,方括号,双引号也被其他人允许(例如SQL Lite)。您正确地说双引号是SQL-92标准,但是问题是:postgresql是否100%符合SQL标准。AFAIK与许多引擎一样,答案是否定的。
2015年

1
  1. 切换到您的数据库
machine$\c my_database
  1. 命名数据库
my_databse=# alter table old_name rename to new_name;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.