要修改一個(gè)表,表必須包含在您的模式中,或者您必須具有該表的ALTER對(duì)象權(quán)限或ALTER ANY TABLE系統(tǒng)權(quán)限。 KingbaseES提供了一族命令來(lái)對(duì)已有的表進(jìn)行修改。通過(guò)更改表,用戶可以對(duì)數(shù)據(jù)庫(kù)中的表作如下修改:
1甲喝、增加列
ALTER TABLE products ADD COLUMN description text;
2、刪除列
ALTER TABLE products DROP COLUMN description;
列中的數(shù)據(jù)將會(huì)消失铛只,涉及到該列的表約束也會(huì)被移除埠胖。然而,如果該列被另一個(gè)表的外鍵所引用淳玩,KingbaseES不會(huì)移除該約束直撤。我們可以通過(guò)增加CASCADE來(lái)授權(quán)移除任何依賴于被刪除列的所有東西:
ALTER TABLE products DROP COLUMN description CASCADE;
3、列增加約束
在現(xiàn)有表基礎(chǔ)上新增加約束蜕着,可以使用表約束的語(yǔ)法谋竖,例如:
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;
要增加一個(gè)不能寫成表約束的非空約束,可使用語(yǔ)法:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
該約束會(huì)立即被檢查承匣,所以表中的數(shù)據(jù)必須在約束被增加之前就已經(jīng)符合約束
4蓖乘、刪除約束
為了移除一個(gè)約束首先需要知道它的名稱。如果在創(chuàng)建時(shí)已經(jīng)給它指定了名稱韧骗,那么事情就變得很容易嘉抒。否則約束的名稱由系統(tǒng)生成氓栈,我們必須先找出這個(gè)名稱吁朦。ksql的命令d表名將會(huì)對(duì)此有所幫助,其他接口也會(huì)提供方法來(lái)查看表的細(xì)節(jié)。因此命令是:
ALTER TABLE products DROP CONSTRAINT some_name;
5逐样、修改列的默認(rèn)值
要為一個(gè)列設(shè)置一個(gè)新默認(rèn)值篡腌,使用命令:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
注意這不會(huì)影響任何表中已經(jīng)存在的行热某,它只是為未來(lái)的INSERT命令改變了默認(rèn)值转捕。 要移除任何默認(rèn)值,使用:
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
這等同于將默認(rèn)值設(shè)置為空值耗式。相應(yīng)的胁住,試圖刪除一個(gè)未被定義的默認(rèn)值并不會(huì)引發(fā)錯(cuò)誤,因?yàn)槟J(rèn)值已經(jīng)被隱式地設(shè)置為空值刊咳。
6措嵌、修改列類型
為了將一個(gè)列轉(zhuǎn)換為一種不同的數(shù)據(jù)類型,使用如下命令:
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
只有當(dāng)列中的每一個(gè)項(xiàng)都能通過(guò)一個(gè)隱式造型轉(zhuǎn)換為新的類型時(shí)該操作才能成功芦缰。如果需要一種更復(fù)雜的轉(zhuǎn)換,應(yīng)該加上一個(gè)USING子句來(lái)指定應(yīng)該如何把舊值轉(zhuǎn)換為新值枫慷。
KingbaseES將嘗試把列的默認(rèn)值轉(zhuǎn)換為新類型让蕾,其他涉及到該列的任何約束也是一樣。但是這些轉(zhuǎn)換可能失敗或者產(chǎn)生奇特的結(jié)果或听。因此最好在修改類型之前先刪除該列上所有的約束探孝,然后在修改完類型后重新加上相應(yīng)修改過(guò)的約束。
7誉裆、重命名列名
ALTER TABLE products RENAME COLUMN product_no TO product_number;
8顿颅、重命名表名
ALTER TABLE products_table RENAME TO products_items;