在數(shù)據(jù)字典中直接修改表列的名稱和順序
2024-07-21 02:41:11
供稿:網(wǎng)友
按照關(guān)系數(shù)據(jù)庫(kù)的理論,行與列都是無(wú)序的,但在實(shí)際應(yīng)用中有時(shí)需要確定列的順序。但在Oracle中,一旦表定義好,再想修改列的順序可不太輕易。 Oracle數(shù)據(jù)庫(kù)沒(méi)有提供直接修改表中列名稱的功能,但在實(shí)際使用時(shí)常需要修改表的列名和列順序,不得已有些Oracle的使用人員用重新創(chuàng)建一個(gè)新的具有正確列名和順序的數(shù)據(jù)庫(kù)表,再將舊表的數(shù)據(jù)轉(zhuǎn)儲(chǔ)進(jìn)來(lái),最后刪除舊表并將新表重命名為舊表的方法來(lái)完成此功能。此方法的最大問(wèn)題是要求有雙倍的存儲(chǔ)空間、較大的回滾段和較長(zhǎng)的時(shí)間,假如表中數(shù)據(jù)量較大,這項(xiàng)工作開(kāi)銷會(huì)很大。實(shí)際上我們可以從數(shù)據(jù)字典中直接修改表列的名稱和順序。下面是具體的實(shí)現(xiàn)步驟: 1.以internal用戶名登錄Oracle數(shù)據(jù)庫(kù),并創(chuàng)建一測(cè)試表。 SQL>CREATE TABLE SCOTT.TEST AS SELECT EMPNO,ENAME FROM SCOTT.EMP; SQL>DESC SCOTT.TEST Name Type Nullable Default Comments ------- ------------ ------- EMPNO NUMBER(4) Y ENAME VARCHAR2(10) Y下面我們要把SCOTT.TEST表中EMPNO和ENAME兩列調(diào)換順序,并把ENAME列更名為EMP_NAME,EMPNO改為EMP_NO。 2.查詢表中列的實(shí)際存儲(chǔ)位置或表。 SQL>SET LONG 9999,由于TEXT列是LONG類型,只有“SET”之后才能完全顯示。 SQL>SELECT TEXT FROM ALL_VIEWS WHERE VIEW_NAME = ‘USER_TAB_COLUMNS’; 數(shù)據(jù)字典視圖USER_TAB_COLUMNS中存儲(chǔ)有表列的定義信息,從該語(yǔ)句的查詢結(jié)果可以看出,列定義信息是存儲(chǔ)在表SYS.COL$中的,即假如修改表中列的定義,應(yīng)該在SYS.COL$表中修改。 3.從數(shù)據(jù)字典視圖ALL_OBJECTS中查找對(duì)象SCOTT.TEST對(duì)象ID。 SQL> SELECT * FROM ALL_OBJECTS WHERE OWNER =‘SCOTT’ AND OBJECT_NAME=‘TEST’; 4.根據(jù)SCOTT.TEST對(duì)象的ID,從SYS.COL$檢索出表中列的定義信息。 SQL> SELECT OBJ#,COL#,NAME FROM SYS.COL$ WHERE OBJ# =13888; OBJ# COL# NAME ---------- ---------- ------- 13888 1 EMPNO 13888 2 ENAME5.使用Update語(yǔ)句來(lái)進(jìn)行修改。 UPDATE SYS.COL$ SET COL# = 2,NAME=‘EMP_NO’ WHERE OBJ# = 13888 AND NAME=‘EMPNO’; UPDATE SYS.COL$ SET COL# = 1,NAME=‘EMP_NAME’ WHERE OBJ# = 13888 AND NAME =‘ENAME’; COMMIT;6. 重啟數(shù)據(jù)庫(kù)服務(wù)。 由于數(shù)據(jù)字典是在數(shù)據(jù)庫(kù)啟動(dòng)時(shí)加載到SQL中的,所以修改了它之后,假如使用“SELECT * FROM SCOTT.TEST; ”,會(huì)發(fā)現(xiàn)似乎并沒(méi)有修改。因此,修改完成之后,還需要重啟數(shù)據(jù)庫(kù)服務(wù)。 SQL>SHUTDOWN SQL>STARTUP這時(shí),再查看,就會(huì)發(fā)現(xiàn)修改已經(jīng)成功。 SQL> SELECT * FROM SCOTT.TEST; EMP_NAME EMP_NO ---------- ------ SMITH 7369 ALLEN 7499 WARD 7521 ……這種方法直接從數(shù)據(jù)庫(kù)中進(jìn)行表列定義的修改,存在一定風(fēng)險(xiǎn),但它對(duì)于數(shù)據(jù)量非凡大的表是非常有用的。充分利用數(shù)據(jù)字典功能,往往能夠完成日常很難完成的工作。