- Oracle數據庫從入門到運維實戰
- 甘長春 孟飛編著
- 2420字
- 2021-09-27 12:48:23
2.4 DDL語句
DDL包含CREATE、ALTER、DROP、RENAME及TRUNCATE等命令,用來對數據庫對象進行創建、修改、刪除、重命名等操作。其中CREATE、ALTER和DROP命令的功能十分強大,幾乎可以對所有的數據庫對象進行管理,例如表、視圖、索引及存儲程序等。在本節僅介紹與表操作有關的DDL語句,與其他數據庫對象有關的DDL語句會在后面的章節中陸續介紹。
2.4.1 表的創建:CREATE語句
CREATE語句可用來創建表。創建表時要確定表的結構,即確定表中各列的名字和類型。在關系數據庫中,表被看作是一個關系,表中的每個列是關系中的屬性,是一個不可再分割的基本單位。表中的行對應關系中的一個元組。表的結構確定以后,就可以通過INSERT語句向表中插入數據。用來創建表的CREATE語句格式為:

如果已經存在同名的表,則應先刪除原來的表,然后再創建。表名是代表這個數據庫對象的名稱,對表名的要求必須是以字母開頭,長度為1~30個字符而且只能包含A~Z、a~z、0~9、_、$、#等字符,不能使用Oracle的保留字(已被Oracle使用的任何東西),在同一個賬戶模式下,表名不能重復。
表中的每一列都有一個名字,在同名的表中不能有同名的列,列的數據類型可以是系統預定義的類型,也可以是用戶自定義數據類型。表2-5列出了系統預定義的數據類型。
表2-5

在創建表時,可以通過default關鍵字為列指定一個默認值,這樣,當用INSERT語句插入一行時,如果沒有為該列指定值,就以默認值填充,而不是空值(null)。
例如,創建一個學生表,表中包括學號、姓名、性別、出生日期、所在學校等列,可以用下列的CREATE語句:
SQL>CREATE TABLE students(sno number(S)r sname char(8),birthday date r school varchar(40)); [000106]
如果要驗證表的結構是否與期望的結果一致,可以在表創建之后通過DESC命令查看表的結構。這個命令只能列出表中各列的列名、數據類型以及是否為空等屬性。
在創建表時,還可以以另一個表為模板確定當前表的結構。一般情況下,可以從一個表復制它的結構,從而快速創建一個表。復制表的結構是通過子查詢來實現的,即在CREATE語句中可以嵌套SELECT語句。這時的CREATE語句格式為:
CREATE TABLE表名AS SELECT語句。
CREATE語句將根椐SELECT子句中指定的列,確定當前表的結構,然后將子查詢返回的數據插入當前表中,這樣在創建表的同時向表中插入了若干行。例如,現在要根據表emp的結構創建表emp_l,僅復制表emp中的empno、deptno和sal三個列,同時復制部門30的數據。相應的CREATE語句為:
SQL>CREATE TABLE emp_l AS SELECT empno,deptno,sal FROM emp WHERE deptno=30; [000107]
一般情況下,在通過這種方式創建的表中,列名和列的定義與原來的表一致。如果希望在創建一個新表時指定與原來的表不同的列名,可以在CREATE語句中的表名之后指定新的列名。如果只希望復制表的結構,而不復制表中的數據,可以將SELECT子句中的條件指定為一個永遠為假的條件。例如,現在希望根據表emp創建表enip_2,為復制的3個列指定新的列名,并且不復制表emp中的數據,相應的CREATE語句為:
SQL>CREATE TABLE emp_2(empno_2 fdeptno_2,sal_2)AS SELECT empno,deptno,sal FROM emp WHERE 1<0; ?。?00108]
實際上,創建表的語句非常復雜,在表上可以定義約束,可以指定存儲參數等屬性。在這里,向讀者介紹兩個概念,一個是模式(Schema),另一個是數據字典(Data dictionary)。模式是指一個用戶所擁有的所有數據庫對象的邏輯集合。在創建一個新用戶時,同時創建了一個同名的模式,這個用戶創建的所有數據庫對象都位于這個模式中。用戶在自己的模式中創建表,需要具有CREATE TABLE系統權限,如果需要在別人的模式中創建表,則需要具有CREATE ANY TABLE權限。在訪問其他用戶的數據庫對象時,要指定對方的模式名稱,例如,通過SCOTT.EMP引用SCOTT用戶的emp表。
數據字典是一些視圖,從這些視圖中可以查看一些重要的系統數據,如數據庫中的表、索引、權限、表空間等信息。這些視圖是在創建數據庫時自動創建的,它們的內容也是由數據庫服務器自動維護的。用戶可以查看以下幾種形式的數據字典視圖:
●以USER_開始的視圖;
●以ALL_開始的視圖;
●以DBA_幵始的視圖。
從USER_視圖中可以查看當前用戶所創建的某類數據庫對象,如在USER_TABLES中可以查看當前用戶所創建的任何一個表的信息。從ALL_視圖中可以查看當前用戶有權限訪問的某類數據庫對象,如在ALL_TABLES中可以查看當前用戶有權限的任何一個表的信息。在DBA_視圖中可以查看當前數據庫中所有的某類對象的信息,如在DBA_TABLES中可以查看當前數據庫中所有的表。DBA_視圖只能由數據庫管理員(一般是SYS用戶)查看。
2.4.2 修改表的結構:ALTER語句
表在創建以后,如果在使用的過程中發現表的結構不合理,可以通過執行ALTER命令修改它的結構。修改表結構的操作包括增加列、修改某個列的定義、刪除列、增加約束、修改約束、表的重命名等。
ALTER語句可以使用若干個子句,通過這些子句可以完成修改表結構的操作。可以使用的子句包括ADD、DROP、MODIFY和RENAME等。
如果要在表中增加一個列,通過ADD子句指定一個列的定義,至少要包括列名和列的數據類型。增加列的語法結構為:
ALTER TABLE表名ADD(列1,數據類型,列2,數據類型,…);
例如,要在students表中增加兩個列,一個是性別,另一個是家庭地址,對應的ALTER語句為:
SQL>ALTER TABLE student ADD(gender char(2)DEFAULT '男',address varchar2(50)); [000109]
值得注意的是,如果一個表中已經有數據,這時增加一個列時,不能將該列約束為“非空(NOT NULL)”,因為不能一方面要求該列必須有數據,而另一方面又無法在增加列的同時向該列插入數據。例如,要向dept表中增加一個非空的列,語句的執行將出錯:
SQL>ALTER TABLE dept ADD(alias char(20)NOT NULL); [000110]
ORA-01758:要添加法定(NOT NULL)列,則表必須為空。
也就是說,要向一個表中增加一個非空列時,這個表必須是空的。如果表中已經有數據,單獨使用“NOT NULL”約束是不行的。一種好的解決辦法是為該列指定默認值,這樣在增加一個非空列的同時,為這個列填充了指定的默認值。
例如,上面的ALTER語句如果修改為下面的形式,就可以確保這個列能夠順利加入表中:
SQL>ALTER TABLE dept ADD(alias char(20)default 'NOT KNOWN' NOT NULL); [000111]
利用ALTER語句還可以從表中刪除一個列。用來完成這個操作的子句是DROP。用于刪除列的ALTER語句格式為:
ALTER TABLE表名DROP COLUMN列名
例如,要刪除表student中的gender列,對應的ALTER語句為:
SQL>ALTER TABLE student DROP COLUMN gender; [000112]
刪除一個列時,這個列將從表的結構中消失,這個列的所有數據也將從表中被刪除。原則上可以刪除任何列,但是一個列如果作為表的主鍵,而且另一個表已經通過外鍵在兩個表之間建立了關聯關系,這樣的列是不能被刪除的。例如,如果要刪除表dept中的列deptno,系統將會發生錯誤:
SQL>ALTER TABLE dept DROP COLUMN deptno; ?。?00113]
如果要修改表中一個列的定義,可以使用ALTER語句的MODIFY子句。通過MODIFY子句可以修改列的長度、非空等屬性。使用了MODIFY子句的ALTER語句格式為:

例如,要將表student中的s_gender列由原來的char(1)改為char(2),非空,將address列由原來的varchar2(50)改為char(40),相應的ALTER語句為:

值得注意的是,如果表中目前沒有數據,那么可以將一個列的長度增加或減小,也可以將一個列指定為非空。如果表中已經有數據,那么只能增加列的長度,如果該列有空值,不能將該列指定為非空。
通過ALTER語句,還可以為表進行重命名,也就是將表的名字改為另一個名字。為表重命名的ALTER語句格式為:
ALTER TABLE表名RENAME to新表名
例如,要將表student重命名為stu,相應的ALTER語句為:
SQL>ALTER TABLE Student RENAME to stu;
SQL>ALTER TABLE Stu RENAME to student; ?。?00115]
2.4.3 對象的刪除和重命名操作
除了CREATE和ALTER兩條主要的命令語句外,DDL還包括DROP、TRUNCATE RENAME等命令語句。
(1)DROP語句
DROP語句的功能是刪除一個對象,通過這條命令幾乎可以刪除任何類型的數據庫對象。用來刪除表的DROP命令的格式為:
DROP TABLE表名
例如,要刪除表stu,相應的DROP語句為:
SQL>DROP TABLE stu; [000116]
數據庫對象刪除后,它的有關信息就從相關的數據字典中刪除。
(2)TRUNCATE語句
TRUNCATE語句的作用是刪除表中的數據。與DELETE語句不同的是,TRUNCATE命令將刪除表中的所有數據,不需要指定任何條件,而且數據被刪除后無法再恢復。這條命令的語法格式為:
TRUNCATE TABLE表名;
例如,要刪除表student中的所有數據,可以執行下面的語句:
SQL>TRUNCATE TABLE student; ?。?00117]
TRUNCATE命令作用的結果是刪除所有的數據,而且不可恢復,所以這條命令要慎用。從執行結果來看,一條TRUNCATE語句相當于下列兩條語句的組合:
DELETE FROM表名;
COMMIT;
(3)RENAME語句RENAME語句的作用是對數據庫對象重新命名。對表進行重新命名的命令格式為:
RENAME表名to新表名;
例如,要將表STUDENT重新命名為STU,相應的RENAME語句為:
SQL>RENAME student to stu; [000118]
表被重新命名以后,它的信息就會在相關的數據字典中更新。
- 程序員面試白皮書
- MySQL數據庫應用與管理 第2版
- 深入理解Django:框架內幕與實現原理
- Vue.js快跑:構建觸手可及的高性能Web應用
- 秒懂設計模式
- Amazon S3 Cookbook
- Python機器學習編程與實戰
- INSTANT Django 1.5 Application Development Starter
- Linux Device Drivers Development
- Getting Started with LLVM Core Libraries
- 軟件測試綜合技術
- 遠方:兩位持續創業者的點滴思考
- Visual Basic語言程序設計上機指導與練習(第3版)
- Microsoft Windows Identity Foundation Cookbook
- C#程序設計基礎與實踐