在 PostgreSQL 中重命名和更改列类型的单个查询

Bilal Shahid 2024年2月15日
  1. 在 MySQL 中重命名和更改列类型
  2. 在 PostgreSQL 中更改数据类型和列名的简单 ALTER 表查询
  3. 在 PostgreSQL 中创建一个用户特定的函数来同时执行两个查询
在 PostgreSQL 中重命名和更改列类型的单个查询

本文描述了在 PostgreSQL 中仅使用单个查询来重命名列并更改其类型。

在 MySQL 中重命名和更改列类型

MySQL 中,如果你想更改列类型并重命名它,你可以使用如下所示的简单语句。

alter table TAB change id identity varchar(50);

前面的语句包括表 TAB 和它的列 ID 作为 INT

create table TAB(
    id int not null,
    name varchar(50) not null
);

这是如何运作的?与其他 SQL 查询相比,CHANGE 是仅由 MySQL 提供的扩展;它使用 ALTER 语句并遵循此约定。

ALTER TABLE tbl_name [alter_option [, alter_option] ...] [partition_options]

对于 alter_option,你可以使用:

CHANGE [COLUMN] old_col_name new_col_name column_definition
        [FIRST | AFTER col_name]

此语法可帮助你有效地使用 CHANGE 语句。你首先输入 table 名称,然后为要更改的列调用 CHANGE

有一个 column_definition,你可以在其中放置此列的更新数据类型。

现在我们已经详细了解了这个 MySQL 扩展,让我们看看我们如何在 PostgreSQL 中做同样的事情。

在 PostgreSQL 中更改数据类型和列名的简单 ALTER 表查询

PostgreSQL 中没有一个单一的 ALTER 语句会执行这样的操作。

ALTER TABLE cat
	ALTER COLUMN id TYPE varchar(50)
	RENAME id TO identity;

以上是错误的,会返回错误。最好的方法是使用多个 ALTER 语句。

ALTER TABLE cat
	ALTER COLUMN id TYPE varchar(50);
ALTER TABLE cat
	RENAME id TO identity;

为什么?因为 PostgreSQL 没有在单个 ALTER 语句中指定多个操作的符号。

PostgreSQL 文档

你可以看到每个 ALTER 语句一次只支持一个操作。因此,如果你在 ALTER 语句之后为列调用 ACTION,你只能使用 ADDALTERDROP 列。

你必须再次调用 ALTER 语句来 RENAME 列。

在 PostgreSQL 中创建一个用户特定的函数来同时执行两个查询

但是,如果你想同时编译这两个操作,你可以创建一个倾向于执行此操作的函数。

create or replace function alter_change_extension(new_type varchar(50), new_name varchar(50))
	returns void
	language plpgsql
	as
$$
begin
if new_type = 'varchar(50)' then
	ALTER TABLE cat ALTER COLUMN id TYPE varchar(50);
end if;
if new_name = 'identity' then
	ALTER TABLE cat RENAME id TO identity;
end if;
end;
$$;

在这里,你为要更改列的 TYPENEW NAME 声明两个变量。你制作 IF 语句来检查值是否存在,然后如果它们为真,你继续并正确 ALTER 列。

你可以针对特定案例场景使用类似的 IF 语句并使你的函数动态化。

这种方法效率不高,因为每次都可能传递唯一的字符串,并且添加大量 IF 语句会使事情变得更糟。但是,你只需要一个查询即可执行此操作。

select alter_change_extension('varchar(50)', 'identity');
作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

相关文章 - PostgreSQL Column