在 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