PostgreSQL 10.1 手冊_部分 II. SQL 語言_第 5 章 數據定義_5.5. 修改表

5.5.?修改表

5.5.1. 增加列5.5.2. 移除列5.5.3. 增加約束5.5.4. 移除約束5.5.5. 更改列的默認值5.5.6. 修改列的數據類型5.5.7. 重命名列5.5.8. 重命名表

當我們已經創建了一個表并意識到犯了一個錯誤或者應用需求發生改變時,我們可以移除表并重新創建它。但如果表中已經被填充數據或者被其他數據庫對象引用(例如有一個外鍵約束),這種做法就顯得很不方便。因此,PostgreSQL提供了一族命令來對已有的表進行修改。注意這和修改表中所包含的數據是不同的,這里要做的是對表的定義或者說結構進行修改。

利用這些命令,我們可以:

  • 增加列

  • 移除列

  • 增加約束

  • 移除約束

  • 修改默認值

  • 修改列數據類型

  • 重命名列

  • 重命名表

所有這些動作都由ALTER TABLE命令執行,其參考頁面中包含更詳細的信息。

5.5.1.?增加列

要增加一個列,可以使用這樣的命令:

ALTER TABLE products ADD COLUMN description text;

新列將被默認值所填充(如果沒有指定DEFAULT子句,則會填充空值)。

也可以同時為列定義約束,語法:

ALTER TABLE products ADD COLUMN description text CHECK (description <> '');

事實上CREATE TABLE中關于一列的描述都可以應用在這里。記住不管怎樣,默認值必須滿足給定的約束,否則ADD將會失敗。也可以先將新列正確地填充好,然后再增加約束(見后文)。

提示

增加一個帶默認值的列需要更新表中的每一行(來存儲新列值)。然而,如果不指定默認值,PostgreSQL可以避免物理更新。因此如果我們準備向列中填充的值大多是非默認值,最好是增加列的時候不指定默認值,增加列后用UPDATE填充正確的數據并且增加所需要的默認值約束。

5.5.2.?移除列

為了移除一個列,使用如下的命令:

ALTER TABLE products DROP COLUMN description;

列中的數據將會消失。涉及到該列的表約束也會被移除。然而,如果該列被另一個表的外鍵所引用,PostgreSQL不會安靜地移除該約束。我們可以通過增加CASCADE來授權移除任何依賴于被刪除列的所有東西:

ALTER TABLE products DROP COLUMN description CASCADE;

關于這個操作背后的一般性機制請見第?5.13?節。

5.5.3.?增加約束

為了增加一個約束,可以使用表約束的語法,例如:

ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;

要增加一個不能寫成表約束的非空約束,可使用語法:

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

該約束會立即被檢查,所以表中的數據必須在約束被增加之前就已經符合約束。

5.5.4.?移除約束

為了移除一個約束首先需要知道它的名稱。如果在創建時已經給它指定了名稱,那么事情就變得很容易。否則約束的名稱是由系統生成的,我們必須先找出這個名稱。psql的命令\d?表名將會對此有所幫助,其他接口也會提供方法來查看表的細節。因此命令是:

ALTER TABLE products DROP CONSTRAINT some_name;

(如果處理的是自動生成的約束名稱,如$2,別忘了用雙引號使它變成一個合法的標識符。)

和移除一個列相似,如果需要移除一個被某些別的東西依賴的約束,也需要加上CASCADE。一個例子是一個外鍵約束依賴于被引用列上的一個唯一或者主鍵約束。

這對除了非空約束之外的所有約束類型都一樣有效。為了移除一個非空約束可以用:

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

(回憶一下,非空約束是沒有名稱的,所以不能用第一種方式。)

5.5.5.?更改列的默認值

要為一個列設置一個新默認值,使用命令:

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

注意這不會影響任何表中已經存在的行,它只是為未來的INSERT命令改變了默認值。

要移除任何默認值,使用:

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

這等同于將默認值設置為空值。相應的,試圖刪除一個未被定義的默認值并不會引發錯誤,因為默認值已經被隱式地設置為空值。

5.5.6.?修改列的數據類型

為了將一個列轉換為一種不同的數據類型,使用如下命令:

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

只有當列中的每一個項都能通過一個隱式造型轉換為新的類型時該操作才能成功。如果需要一種更復雜的轉換,應該加上一個USING子句來指定應該如何把舊值轉換為新值。

PostgreSQL將嘗試把列的默認值轉換為新類型,其他涉及到該列的任何約束也是一樣。但是這些轉換可能失敗或者產生奇特的結果。因此最好在修改類型之前先刪除該列上所有的約束,然后在修改完類型后重新加上相應修改過的約束。

5.5.7.?重命名列

要重命名一個列:

ALTER TABLE products RENAME COLUMN product_no TO product_number;

5.5.8.?重命名表

要重命名一個表:

ALTER TABLE products RENAME TO items;
本文轉自PostgreSQL中文社區,原文鏈接:5.5.?修改表

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281989.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Uptime-Kuma 一個輕量的開源監控工具

點擊藍字 關注我們你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘記關注。今天給大家介紹一個開源的監控工具 Uptime Kuma, 主要用來監控 Web 以及網絡, 和 Prometheus 相比, 它是輕量的, Uptime Kuma 是基于…

怎么查看mysql正在運行的語句_MySQL如何查詢當前正在運行的SQL語句

通過status命令&#xff0c;查看Slow queries這一項&#xff0c;如果值長時間>0,說明有查詢執行時間過長以下為引用的內容&#xff1a;mysql> status;--------------mysql Ver 11.18 Distrib 3.23.58, for redhat-linux-gnu (i386)Connection id: 53Current database: (n…

SpringBoot實戰之SpringBoot自動配置原理

SpringBoot 自動配置主要通過 EnableAutoConfiguration, Conditional, EnableConfigurationProperties 或者 ConfigurationProperties 等幾個注解來進行自動配置完成的。EnableAutoConfiguration 開啟自動配置&#xff0c;主要作用就是調用 Spring-Core 包里的 loadFactoryName…

Install OpenCV-Python in Ubuntu

之前安裝python版opencv&#xff0c;需要下載whl文件&#xff0c;進行安裝&#xff0c;這是在window環境下的&#xff1a;安裝opencv_python,下載whl包安裝系統python下的opencv 今天發現一個簡單的方法。Install OpenCV-Python in UbuntuInstall package python-opencv with f…

如何健康地跑步?

最近某司高管跑步 28 公里后猝死&#xff0c;被各大媒體報道&#xff0c;每次這種悲劇發生&#xff0c;而且還跟跑步扯上關系&#xff0c;總是讓人心痛。通過報道了解到&#xff0c;這位高管酷愛跑馬拉松&#xff0c;身體素質和運動能力肯定是強于普通人的&#xff0c;但還是遭…

項目共享協調機制

API&#xff0c;協調前端與后端開發的連接點。 面臨幾個問題 1. API更新不及時&#xff0c;導致前端開發的接口沒有及時更新而出現各種問題。 2. 文檔描述得不準確 3. 沒有統一的標準。 我們可以使用swagger editor&#xff0c; swagger ui。第一是編輯器&#xff0c;第二個是展…

vs2008C1902程序數據庫管理不匹配

大清早打開vs2008,出現這么詭異的錯&#xff0c; 刪了一個dll的就好了。如圖

mysql user表 空_mysql 忘記密碼,重置密碼,mysql.user表為空的解決辦法

一、用戶表有用戶&#xff0c;直接修改密碼ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)修改mysql配置文件my.cnf&#xff1a;vim /etc/my.cnf在[mysqld]中添加skip-grant-tables重啟mysql服務&#xff0c;用空密碼直接登錄&#xff0c;查…

鏈式封裝與調用

var CheckObject function(){}; CheckObject.prototype function(){checkName:function(){// codereturn this;},checkEmail:function(){// code return this;},checkPassword:function(){// codereturn this;} } //使用 var Check new CheckObject() Check.checkName().che…

全新升級的AOP框架Dora.Interception[3]: 基于特性標注的攔截器注冊方式

在Dora.Interception中按照約定方式定義的攔截器可以采用多種方式注冊到目標方法上。本篇文章介紹最常用的基于“特性標注”的攔截器注冊方式&#xff0c;下一篇會介紹另一種基于&#xff08;Lambda&#xff09;表達式的注冊方式&#xff1a;全新升級的AOP框架Dora.Interceptio…

在慘遭勒索病毒攻擊之后,微軟呼吁重新制定“數字日內瓦公約”

基于美國安全局泄露文檔開發的病毒程序成為上周的主要新聞&#xff0c;該病毒導致全世界大量的Windows電腦癱瘓。WannaCry勒索病毒在150個國家有20萬個受害者&#xff0c;包括英國的醫院、西班牙的基礎設施部門和俄羅斯的內政部。Renault在受到攻擊之后關閉了幾家在法國境內的工…

【代碼審計】PHP代碼審計---基礎記錄

PHP偽協議 PHP偽協議事實上是其支持的協議與封裝協議&#xff0c;支持的種類有以下12種。 * file:// — 訪問本地文件系統 * http:// — 訪問 HTTP(s) 網址 * ftp:// — 訪問 FTP(s) URLs * php:// — 訪問各個輸入/輸出流&#xff08;I/O streams&#xff09; * zlib:// — 壓…

全新升級的AOP框架Dora.Interception[4]: 基于表達式的攔截器注冊

基于特性標注的攔截器注冊方式僅限于將攔截器應用到自己定義的類型上&#xff0c;對于第三方提供的類型就無能為力了。對于Dora.Interception來說&#xff0c;攔截器注冊本質上建立攔截器與一個或者多個目標方法之間的映射&#xff0c;所以最笨的方式就是利用反射的方式得到表示…

mysql8.0.12插件_MySQL8.0.12 安裝及配置

MySQL8.0.12 安裝及配置發布時間&#xff1a;2018-08-07 10:39,瀏覽次數&#xff1a;274, 標簽&#xff1a;MySQL一.安裝1.從網上下載MySQL8.0.12版本&#xff0c;下載地址&#xff1a;https://dev.mysql.com/downloads/mysql/2. 下載完成后解壓我解壓的路徑是&#xff1a;D:\J…

python模塊之hashlib

hashlib模塊實現了多種安全哈希和信息摘要算法的通用接口&#xff0c;包括FIPS中定義的SHA1, SHA224, SHA256, SHA384, SHA512以及RFC 1321中定義的MD5 注意點&#xff1a;1. adler32及crc32哈希由zlib模塊提供2. 某些算法已知存在哈希碰撞弱點 哈希算法 每個hash算法都有一個同…

記一次阿里電面經歷

昨天下午&#xff08;3/19&#xff09;三點多鐘&#xff0c;接到了一個杭州的電話&#xff0c;是阿里的。問我是否方便聊聊。我說我在上課&#xff0c;四點下課。然后他就四點多鐘的時候又打了一次過來。項目經歷上來就問我有無大型項目的經歷。不好意思&#xff0c;我說無。。…

C語言程序設計第三次作業

&#xff08;一&#xff09;改錯題 計算f(x)的值&#xff1a;輸入實數x&#xff0c;計算并輸出下列分段函數f(x)的值&#xff0c;輸出時保留1位小數。 輸入輸出樣例1&#xff1a;   Enterr x: 10.0   f(10.0) 0.1 輸入輸出樣例2&#xff1a;   Enter x: 234   f(234.0…

mysql數據庫項目化教程鄭小蓉_MySQL數據庫項目化教程(高等職業教育“十三五”規劃教材(軟件技術專業))...

《MySQL數據庫項目化教程/高等職業教育十三五規劃教材(軟件技術專業)》是一本介紹MySQL數據庫基礎知識的入門教材&#xff0c;采用項目驅動方式循序漸進地介紹MySQL各個模塊的知識。主要內容包括&#xff1a;Windows下MySQL的安裝&#xff0c;MySQL服務的啟動與停止&#xff0c…

WPF-09 ManualResetEventSlim信號量

業務場景如下&#xff1a;WPF應用程序后臺有個定時任務在接收PLC硬件數據(該線程接收完數據之后, 會重新啟動一個新線程繼續接收.....)&#xff0c;當應用程序關閉時, 我們得確保接收PLC硬件數據的線程完成之后,再關閉應用程序&#xff0c;否則會造成數據丟失。上面的業務場景是…

【bzoj3033】太鼓達人 DFS歐拉圖

題目描述 給出一個整數K&#xff0c;求一個最大的M&#xff0c;使得存在一個每個位置都是0或1的圈&#xff0c;圈上所有連續K位構成的二進制數兩兩不同。輸出最大的M以及這種情況下字典序最小的方案。 輸入 一個整數K。 輸出 一個整數M和一個二進制串&#xff0c;由一個空格分隔…