達夢數據庫提供基表修改語句,對基表的結構進行全面的修改,包括修改基表名、列名、增長列、刪除列、修改列類型、增長表級約束、刪除表級約束、設置列缺省值、設置觸發器狀態等一系列修改。sql
通用格式:ALTER TABLE [[.] .] 數據庫
下面經過例子來如何進行操做:根據實際狀況對進行相應的變化code
1.修改一列(字段)的數據類型、精度、刻度,設置列上的 DEFAULT,NOT NULL,NULL;對象
a. 使用 MODIFY COLUMN 時, 要更改的列不能是:
(1)彙集索引的列或者引用約束中引用和被引用的列; //(信息量比較大)
(2)用於 CHECK 約束的列。 //(信息量比較大)
b. 使用 MODIFY COLUMN 子句不能在列上增長 check 約束,能修改的約束只有列上的NULL, NOT NULL 約束; 若是某列現有的值均非空,則容許添加 NOT NULL; 屬於彙集索引包含的列不能被修改; 自增列不容許被修改。
c. 使用 MODIFY COLUMN 修改可更改列的數據類型時,若該表中無元組(表中的一行稱爲元組,無元組即每行都沒有數據),則可任意修改
其數據類型、長度、精度或量度;若表中有元組,則系統會嘗試修改其數據類型、長度、精度或量度,若是修改不成功,則會報錯返回。
特殊說明: 不管表中有、無元組,多媒體數據類型和非多媒體數據類型都不能相互轉換。 d.修改有默認值的列的數據類型時, 原數據類型與新數據類型必須是能夠轉換的,不然即便數據類型修改爲功,但在進行插入等其餘操做時, 仍會出現數據類型轉換錯誤。索引
舉例說明:產品
例1 產品的評論表中COMMENTS、 PRODUCT_REVIEWID、 PRODUCTID、 RATING幾列都不容許修改,分別由於: COMMENTS爲多媒體數據類型; PRODUCT_REVIEWID上定義有關鍵字,屬於用於索引的列; PRODUCTID用於引用約束(包括引用列和被引用列); RATING用於CHECK約束。另外,關聯有缺省值的列也不能修改。而其餘列都容許修改。假定當前數據庫爲BOOKSHOP,用戶爲SYSDBA,如將評論人姓名的數據類型改成varchar(8),並指定該列爲NOTNULL,且缺省值爲'劉青': ALTER TABLE PRODUCTION.PRODUCT_REVIEW MODIFY NAME varchar(8) DEFAULT '劉青' NOTNULL; 此語句只有在表中無元組的狀況下才能成功。
2. 增長一列(字段)及該列(字段)上的列級約束;class
a.使用 ADD COLUMN 時,新增列名之間、新增列名與該基表中的其它列名之間均不能重複。若新增列跟有缺省值,則已存在的行的新增列值是其缺省值。添加新列對於任何涉及表的視圖定義或約束定義沒有做用。例如: 若是用「*」爲一個表建立一個視圖,那麼後加入的新列不會自動地加入視圖中,只能從新建立此視圖。
b.使用 ADD COLUMN 時,還有如下限制條件:
(1)列定義中若是帶有列約束,只能是對該新增列的約束;列級約束能夠帶有約束名,系統中同一模式下的約束名不得重複,若是不帶約束名,系統自動爲此約束命名;
(2)若是表上沒有元組,列能夠指定爲 NOT NULL;若是表中有元組,對於已有列能夠指定同時有 DEFAULT 和 NOT NULL,新增列不能指定 NOT NULL(由於若是指定爲not null那麼以前存在的數據根本就沒有這一列的數據,你還讓它不能爲空,是何居心?);
(3)該列可指定爲 CHECK;
(4)該列可指定爲 FOREIGN KEY;
(5) 容許向空數據的表中,添加自增列。
舉例說明:select
例2 具備DBA權限的用戶須要對EMPLOYEE_ADDRESS表增長一列,列名爲ID(序號),數據類型爲INT,值小於10000。 ALTER TABLE RESOURCES.EMPLOYEE_ADDRESS ADD ID INT PRIMARY KEY CHECK (ID <10000); 若是該表上沒有元組,且沒有PRIMARY KEY,則能夠將新增列指定爲 PRIMARY KEY。表上沒有元組時也能夠將新增列指定爲UNIQUE,但同一列上不能同時指定PRIMARY KEY和UNIQUE兩種約束。 例3 具備DBA權限的用戶須要對ADDRESS表增長一列, 列名爲PERSONID,數據類型爲INT,定義該列爲NOT NULL,並引用PERSON的PERSONID。 ALTER TABLE PERSON.ADDRESS ADD PERSONID INT NOT NULL REFERENCES PERSON. PERSON(PERSONID); 若是表上沒有元組,新增列能夠指定爲 NOT NULL;若是表上有元組且都不爲空,該列能夠指定同時有 DEFAULT 和 NOT NULL,不能單獨指定爲 NOT NULL
3. 刪除一列(字段);權限
用 DROP COLUMN 子句刪除一列有兩種方式: RESTRICT 和 CASCADE。 RESTRICT 方式爲缺省選項,確保只有不被其餘對象引用的列才被刪除。不管哪一種方式,表中的惟一列不能被刪除。 RESTRICT 方式下,下列類型的列不能被刪除:被引用列、建有視圖的列、有 check 約束的列。刪除列的同時將刪除該列上的約束。 CASCADE 方式下,將刪除這一列上的引用信息和被引用信息、引用該列的視圖、索引和約束;系統容許直接刪除 PK 列(我猜pk列指的應該是主鍵列)。但被刪除列爲 CLUSTER PRIMARY KEY 類型時除外,此時不容許刪除。(藍色字沒看懂)。數據類型
例 4 具備 DBA 權限的用戶須要刪除 PRODUCT 表的 PRODUCT_SUBCATEGORYID 一列。 ALTER TABLE PRODUCTION.PRODUCT DROP PRODUCT_SUBCATEGORYID CASCADE; 刪除PRODUCT_SUBCATEGORYID這一列必須採用CASCADE方式,由於該列引用了PRODUCT_SUBCATEGORY表的PRODUCT_SUBCATEGORYID。
4 . 表名或列表的重命名
舉例說明:具備DBA權限的用戶須要將表MY_STUDENT的SEX字段改成GENDER
ALTER TABLE DMHR.MY_STUDENT ALTER SEX RENAME TO GENDER;
/前4個是操做表的字段的,後幾個是操做關於這個表的屬性的*/
5. 增長表上的約束;
ADD CONSTRAINT 子句用於添加表級約束。表級約束包括:主鍵約束(PRIMARY KEY),惟一性約束(UNIQUE),引用約束(REFERENCES),檢查約束(CHECK)。添加表級約束時能夠帶有約束名,系統中同一模式下的約束名不得重複,若是不帶約束名,系統自動爲此約束命名。用 ADD CONSTRAINT 子句添加約束時, 對於該基表上現有的所有元組要進行約束違規驗證:
(1)添加一個主鍵約束時,要求將成爲關鍵字的字段上無重複值且值非空,而且表上沒有定義主關鍵字;
(2)添加一個 UNIQUE 約束時,要求將成爲惟一性約束的字段上不存在重複值,但容許有空值;
(3)添加一個 REFERENCES 約束時,要求將成爲引用約束的字段上的值知足該引用約束。
(4)添加一個 CHECK 約束或外鍵時,要求該基表中所有的元組知足該約束。
例5 具備DBA權限的用戶須要在PRODUCT表上增長UNIQUE約束, UNIQUE字段爲NAME。 ALTER TABLE PRODUCTION.PRODUCT ADD CONSTRAINT CONS_PRODUCTNAME UNIQUE(NAME); 用ADD CONSTRAINT子句添加約束時, 對於該基表上現有的所有元組要進行約束違規驗證。 在這裏,分爲三種狀況: (1)若是表商場登記裏沒有元組,則上述語句必定執行成功; (2)若是表商場登記裏有元組,而且欲成爲惟一性約束的字段商場名上不存在重複值,則 上述語句執行成功; (3)若是表商場登記裏有元組,而且欲成爲惟一性約束的字段商場名上存在重複值,則上 述語句執行不成功,系統報錯「沒法創建惟一性索引」。 若是語句執行成功,用戶經過查詢 SELECT TABLEDEF('BOOKSHOP', 'PRODUCTION', 'PRODUCT'); 能夠看到,修改後的商場登記的表結構顯示爲: CREATE TABLE "PRODUCT" AT "BOOKSHOP" ( "PRODUCTID" INTEGER IDENTITY(1,1) NOT NULL, "NAME" VARCHAR(50) NOT NULL, "AUTHOR" VARCHAR(25) NOT NULL, "PUBLISHER" VARCHAR(50) NOT NULL, "PUBLISHTIME" DATE NOT NULL, "PRODUCT_SUBCATEGORYID" INTEGER NOT NULL, "PRODUCTNO" VARCHAR(25) NOT NULL, "SATETYSTOCKLEVEL" SMALLINT NOT NULL, "ORIGINALPRICE" DEC(19,4) NOT NULL, "NOWPRICE" DEC(19,4) NOT NULL, "DISCOUNT" DEC(2,1) NOT NULL, "DESCRIPTION" TEXT, "PHOTO" IMAGE, "TYPE" VARCHAR(5), "PAPERTOTAL" INTEGER, "WORDTOTAL" INTEGER, "SELLSTARTTIME" DATE NOT NULL, "SELLENDTIME" DATE, PRIMARY KEY("PRODUCTID"), UNIQUE("PRODUCTNO"), CONSTRAINT "CONS_PRODUCTNAME" UNIQUE("NAME"), FOREIGN KEY("PRODUCT_SUBCATEGORYID") REFERENCES"PRODUCT_SUBCATEGORY"("PRODUCT_SUBCATEGORYID"))
能夠看到CONS_PRODUCTNAME就是UNIQUE約束名。
6. 刪除表上的約束;
DROP CONSTRAINT 子句用於刪除表級約束,表級約束包括:主鍵約束(PRIMARY KEY)、
惟一性約束(UNIQUE)、引用約束(REFERENCES)、檢查約束(CHECK)。用 DROP CONSTRAINT
子句刪除一約束時, 一樣有 RESTRICT 和 CASCADE 兩種方式。 當刪除主鍵或惟一性約束時,
系統自動建立的索引也將一塊兒刪除。 若是打算刪除一個主鍵約束或一個惟一性約束而它有外部約
束,除非指定 CASCADE 選項,不然將不容許刪除。也就是說,指定 CASCADE 時,刪除的不
僅僅是用戶命名的約束,還有任何引用它的外部約束。
例6 假定當前數據庫爲BOOKSHOP,庫中具備DBA權限的用戶須要刪除PRODUCT表上的NAME的UNIQUE約束。當前的PRODUCT表結構請參見例5。刪除表約束,首先須要獲得該約束對應的約束名,用戶能夠查詢系統表 SYSCONSTRAINTS,以下所示: SELECT NAME FROM SYSCONSTRAINTS WHERE TABLEID =(SELECT ID FROM SYSTABLES WHERE NAME = 'PRODUCT' AND SCHID=( select SCHID from sysschemas where name='PRODUCTION')); 該系統表顯示商場登記表上的全部PRIMARY KEY, UNIQUE, CHECK約束。查詢獲得NAME上UNIQUE約束對應的約束名,這裏爲CONS_PRODUCTNAME。而後,可採用如下的語句刪除指定約束名的約束: ALTER TABLE PRODUCTION.PRODUCT DROP CONSTRAINT CONS_PRODUCTNAME; 語句執行成功。