在 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
語句中指定多個操作的符號。
你可以看到每個 ALTER
語句一次只支援一個操作。因此,如果你在 ALTER
語句之後為列呼叫 ACTION
,你只能使用 ADD
、ALTER
或 DROP
列。
你必須再次呼叫 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;
$$;
在這裡,你為要更改列的 TYPE
和 NEW NAME
宣告兩個變數。你製作 IF
語句來檢查值是否存在,然後如果它們為真,你繼續並正確 ALTER
列。
你可以針對特定案例場景使用類似的 IF
語句並使你的函式動態化。
這種方法效率不高,因為每次都可能傳遞唯一的字串,並且新增大量 IF
語句會使事情變得更糟。但是,你只需要一個查詢即可執行此操作。
select alter_change_extension('varchar(50)', 'identity');
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