ORACLE實例練習一

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. 爲字段設置默認值

  • 默認值不屬於約束,無法在約束中查看
  • 只能使用下列三種:
  1. 常量值(字符串)
  2. 系統函數(SYSTEM_USER())
  3. 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> /

表已創建。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章