文章目錄
1. 建表
create table stu (
sno varchar2 (10) not null,
sname varchar2(10),
sgentle varchar2(2),
sbirth date,
sdept varchar2(20))
tips:
date 存儲日期與時間
timestamp 年月日時分秒 秒後6位同時包含時區
clob 存儲大文本,ex:非結構化的XML文檔
blob 二進制對象,ex:圖形、視頻、聲音等
2. 添加字段
SQL> l
1 alter table stu
2 add snajor varchar2(20)
3 default '計算機科學與技術'
4* not null
SQL> /
alter table stu
*
第 1 行出現錯誤:
ORA-00600: 內部錯誤代碼, 參數: [kkdlReadOnDiskDefVal: bad defValLen], [24],
[20], [], [], [], [], [], [], [], [], []
這裏有
報錯ORA-00600
,參考https://stackoverflow.com/questions/18050871/ora-00600-internal-error-code-arguments-4194-65-51?r=SearchResults
重新打開一個命令窗口後不再報錯。
3. 修改字段
SQL> l
1 alter table stu
2 modify snajor varchar2(200)
3* default '計算機科學與技術'
4. 刪除字段
SQL> alter table stu
2 drop column sbirth
3 /
alter table stu
*
第 1 行出現錯誤:
ORA-12988: 無法刪除屬於 SYS 的表中的列
sys用戶不能刪除表中字段,那就只好新建一個用戶了
SQL> create user scott identified by tiger;
create user scott identified by tiger
*
第 1 行出現錯誤:
ORA-65096: 公用用戶名或角色名無效
新建用戶由於版本不一樣,12和11的命令似乎不一樣,12在CDB模式下需要以C##開頭新建用戶
新建用戶
SQL> create user c##a identified by password;
SQL> grant dba,connect to c##a;
授權成功。
5. 重命名錶
兩種方法
SQL> rename stu to stu1;
表已重命名。
SQL> alter table stu1 rename to stu;
表已更改。
6. 複製相同結構的表
SQL> create table stu1 as select * from stu where 1=2;
表已創建。
SQL> desc stu1;
名稱 是否爲空? 類型
----------------------------------------- -------- ----------------------------
SNO NOT NULL VARCHAR2(10)
SNAME VARCHAR2(10)
SGENTLE VARCHAR2(2)
SBIRTH DATE
SDEPT VARCHAR2(20)
where 1 = 2
表示只複製表結構,不復製表數據
也可寫成
where rownum<1
7. DROP刪除表
SQL> drop table stu1;
表已刪除。
drop執行後,目標表被移除到回收站中,基於該表的索引、觸發器等對象也同時刪除;
該表並未完全消失,而是被重命名爲系統定義名稱,存在於統一表空間中,具有與原始表相同結構,還可被恢復。
8. 創建主鍵約束
一個表只能有一個主鍵約束,可以爲一列或一組列。
主鍵保證數據的唯一性和非空
創建表時
SQL> create table stu(
2 sno varchar2(10) primary key,
3 sname varchar2(10),
4 sgentle varchar2(2),
5 sage number(2),
6 sbirth date,
7 sdept varchar2(20))
8 /
創建表後
SQL> alter table stu add constraint pk_stu primary key(sno)
9. 創建唯一性約束
unique約束保證了在非主鍵列不輸入重複的值,每個字段只允許一個空值
SQL> create table stu(
2 sno varchar2(10) unique,
3 sname varchar2(10),
4 sgentle varchar2(2),
5 sage number(2),
6 sbirth date,
7 sdept varchar2(20))
8 /
表已創建。
10. 創建CHECK約束
限制輸入到一列或者多列的值的範圍
- Oracle PL/SQL支持單獨一列使用多個check約束,按約束創建的順序對其取值
- 可在表一級創建check約束,再應用到多列
建表時創建:
SQL> create table stu(
2 sno varchar2 (10),
3 sname varchar2(10),
4 sgentle varchar2(10),
5 check(sgentle='男' or sgentle='女'),
6 sage number(2)
7 check(sage>=10 and sage<=90),
8 sbirth date,
9 sdept varchar2(20))
10 /
表已創建。
建表後創建:
SQL> alter table stu
2 add constraint ck_stu
3 check(sno>='120001' and sno<='129999')
4 /
表已更改。
查看所有約束
SQL> l
1 select table_name,constraint_name,constraint_type
2 from user_constraints
3* where table_name='STU'
SQL> /
TABLE_NAME CONSTRAINT_NAME CO
----------- ---------------------- --
STU SYS_C008453 C
STU SYS_C008454 C
STU CK_STU C
- C表示約束屬於CHECK類型
- P表示PRIMARY KEY
- U表示UNIQUE KEY
- R表示外鍵FOREIGN KEY
11. 創建外鍵約束
- 即FOREIGN KEY約束,爲表中的一列或者多列提供數據完整性參照;
- 通常與PRIMARY約束或者UNIQUE約束同時使用;
- 可包含空值,包含空值時將跳過所有值的驗證
SQL> create table stu1 (
2 sno varchar2(10),
3 foreign key(sno)
4 references stu(sno),
5 sname varchar2(10),
6 sgentle varchar2(2),
7 sage number(2),
8 sbirth date,
9 sdept varchar2(20))
10 /
references stu(sno),
*
第 4 行出現錯誤:
ORA-02270: 此列列表的唯一關鍵字或主鍵不匹配
引用stu表的SNO字段作爲STU1表的外鍵,必須保證SNO是STU的主鍵
SQL> save d:1.sql
已創建 file d:\1.sql
SQL> alter table stu add constraint pk_stu primary key(sno);
表已更改。
SQL> @ d:1.sql
表已創建。
SQL> select table_name ,constraint_name,constraint_type from user_constraints where table_name in('STU','STU1');
TABLE_NAME CONSTRAINT_NAME CO
----------- ---------------------- --
STU SYS_C008453 C
STU SYS_C008454 C
STU CK_STU C
STU PK_STU P
STU1 SYS_C008457 R
追加外鍵約束
SQL> l
1 alter table stu1
2 add constraint fk_stu
3* foreign key(sno) references stu(sno
12. 刪除約束
通過確認的約束名刪除
SQL> select table_name ,constraint_name,constraint_type from user_constraints where table_name in('STU','STU1');
TABLE_NAME CONSTRAINT_NAME CO
----------- ---------------------- --
STU SYS_C008453 C
STU SYS_C008454 C
STU CK_STU C
STU PK_STU P
STU1 SYS_C008457 R
SQL> alter table stu
2 drop constraint SYS_C008453
3 /
表已更改。
SQL> select table_name ,constraint_name,constraint_type from user_constraints where table_name in('STU','STU1');
TABLE_NAME CONSTRAINT_NAME CO
----------- ---------------------- --
STU1 SYS_C008457 R
STU SYS_C008454 C
STU CK_STU C
STU PK_STU P
13. 爲字段設置默認值
- 默認值不屬於約束,無法在約束中查看
- 只能使用下列三種:
- 常量值(字符串)
- 系統函數(SYSTEM_USER())
- NULL
- 只能在創建表時執行
SQL> L
1 create table stu (
2 sno varchar2 (10)
3 primary key,
4 sname varchar2(10)
5 not null,
6 sgentle varchar2(4)
7 default '男',
8 sage number(2),
9 sbirth date,
10 sdept varchar2(20)
11* default '暫未分配')
SQL> /
表已創建。