Oracle【二維表管理:約束】

一、簡單的表建立和字段類型
最簡單的方式去建立表(沒有添加主鍵之類的約束條件)
【Oracle的字段類型】
number:數值類型
--整數類型:number(a) 總長度a
--小數類型:number(a,b) 總長度a,小數長度b,小數可缺省
varchar2:字符類型
--字符類型 varchar2(ln) ln表示字符的最大長度,實際存儲內存的長度<=ln
--特色:多態分配存儲空間,節省空間
char:字符類型
--字符類型char(ln) 無論字符數據長度多大,直接在內存開闢ln大小的空間存儲數據
--特色:存儲效率高於varchar2
date:日期類型
建立表最基本語法:sql

create table 表名(
     字段名 類型,
     字段名 類型,
     字段名 類型,
     ........
     字段名 類型  --最後一個字段不要加逗號
    );

建立一張學生表並添加n條測試數據:ide

--建立一張學生表
create table student(
  sno number(10),
  sname varchar2(50),
  sage number(3),
  ssex char(4),
  sbirth date,
  sjob varchar2(100)
);
--添加測試數據
insert into student values(1,'小喜慶','女',18,'7-10月-18','學生');
insert into student values(2,'迪麗熱巴','女',27,to_date('1992-06-03','yyyy-mm-dd'),'演員');
--刪除表:drop table 表名;
drop table student;



二、二維表建立約束學習:(主鍵約束,非空約束,檢查約束,惟一約束)學習

 1 --刪除表:drop table 表名;
 2 drop table student;
 3 
 4 select * from student;
 5 --建立簡單的學生表
 6 create table student(
 7   sno number(15), --primary key, --添加主鍵約束_1
 8   sname varchar2(50),-- not null,--添加非空約束_1
 9   sex varchar2(4),--check(sex='男' or sex='女'),--添加檢查約束
10   sage number(3),-- check(sage>0 and sag<=200),--添加檢查約束_1
11   sbirth date,
12   phone number(20) -- 添加惟一約束 unique
13   --constraints pk_student_sno primary key(sno) --添加主鍵約束_2
14   --constraints ck_student_sname check(sname is not null) --添加非空約束_2
15   --constraints ck_student_sage check(sage>0 and sage<=200)--添加檢查約束_2
16   --constraints un_student_phone unique(phone)--惟一約束
17   
18 );
19 ----------------------------------建立表後在去建立約束---------------------------------------
20 --添加主鍵約束
21 alter table student add constraints pk_student_sno primary key(sno);--添加主鍵約束_3
22 alter table student drop  constraints pk_student_sno;--刪除主鍵約束
23 --添加非空約束
24 alter table student add  constraints ck_student_sname check(sname is not null) --添加非空約束_3
25 alter table student drop  constraints ck_student_sname;--刪除非空約束
26 --添加檢查約束
27 alter table student add constraints ck_student_sage check(sage>0 and sag<=200)--添加檢查約束_3
28 alter table student drop  constraints ck_student_sage; --刪除檢查約束
29 --添加惟一約束
30 alter table student add constraints un_student_phone unique(phone)--惟一約束
31 
32 
33 
34 --添加測試數據
35 insert into student values(2018112001,'小喜慶','',18,'7-10月-18',10086);
36 
37 ----------------------------------沒有添加約束存在的一些問題---------------------------------------
38 ---Oracle表約束【沒有添加約束存在的一些問題】
39 --問題1:字段(學號)可重複添加  
40 insert into student values(2018112001,'迪麗熱巴','',27,to_date('1992-06-03','yyyy-mm-dd'),10010);
41 --解決1:使用主鍵 primary key,特色:非空惟一
42 添加主鍵方法:1:直接在建立表的字段後使用關鍵字 primary key
43              2:在建立表的語句的最後面使用 constraints pk_表名_字段名 primary key(字段名)
44              3:在建立表後使用 alter table 表名 add  constraints pk_表名_字段名 primary key(字段名);
45              4:刪除主鍵 alter table student drop  constraints 主鍵的約束名;
46              
47 --問題2:必填的字段(sname)能夠爲空
48 insert into student values(2018112001,'','',27,to_date('1992-06-03','yyyy-mm-dd'),10010);
49 --解決2:使用非空約束 not null
50 添加非空約束:1:直接在建立表的字段後使用關鍵字 not null
51              2:在建立表的語句的最後面使用 constraints ck_表名_字段名 check(字段名 is not null)
52              3:在建立表後使用 alter table 表名 add  constraints ck_表名_字段名 check(字段名 is not null);
53              4:刪除非空約束 alter table student drop  constraints 非空約束名;
54 
55 --問題3:違背了天然定律
56 insert into student values(2018112001,'小喜慶','',218,'7-10月-18',10086);
57 --解決3:使用檢查約束
58 添加非空約束:1:直接在建立表的字段後使用 check(條件) 例如      sage number(3) check(sage>0 and sag<=200),
59              2:在建立表的語句的最後面使用 constraints ck_表名_字段名 check(條件)
60              3:在建立表後使用 alter table 表名 add  constraints ck_表名_字段名 check(條件);
61              4:刪除檢查約束 alter table student drop  constraints 檢查約束名;
62 --問題4:手機號能夠重複
63 insert into student values(2018112001,'小喜慶','',218,'7-10月-18',10086);
64 --問題4:使用惟一約束
65 添加非空約束:1:直接在建立表的字段後使用 unique
66              2:在建立表的語句後面使用 constraints un_表名_字段名 unique(字段名);
67              3:在建立表後使用 alter table 表名 add  constraints un_表名_字段名 unique(字段名);
68              4:刪除約束:alter table 表名 drop  constraints 惟一約束名;
View Code
--建立表並同時添加約束
create table student(
  sno number(15), 
  sname varchar2(50),
  sex varchar2(4),
  sage number(3),
  sbirth date,
  phone number(20),
  constraints pk_student_sno primary key(sno), --添加主鍵約束
  constraints ck_student_sname check(sname is not null), --添加非空約束
  constraints ck_student_sage check(sage>0 and sage<=200),--添加檢查約束
  constraints un_student_phone unique(phone)--惟一約束
  
);

--添加測試數據
insert into student values(2018112001,'小喜慶','女',18,'7-10月-18',10086);
insert into student values(2018112002,'迪麗熱巴','女',27,to_date('1992-06-03','yyyy-mm-dd'),10010);

三、二維表建立約束學習:外鍵約束測試

 1 --學生信息表
 2 create table student (
 3       sid number(10) primary key,
 4       sname varchar2(50) not null,
 5       ssex char(4) check(ssex='' or ssex=''),
 6       sage number(3) check(sage>=0 and sage<=200),
 7       sqq number(20) unique,
 8       cno number(10) references class(cno)
 9 );
10 --添加數據
11 insert into student values(1,'迪麗熱巴','',27,13245668,1);
12 insert into student values(2,'遊戲解說柚子','',24,11545668,1);
13 insert into student values(3,'傑西','',22,135668,2);
14 insert into student values(4,'傑克','',21,1323268,2);
15 
16 --班級表
17 create table class (
18       cno number(10) primary key,
19       cname varchar2(50) not null,
20       cdesc varchar2(50)
21 );
22 insert into class values(1,'計算機1班','明星班');
23 insert into class values(2,'計算機2班','遊戲解說班');


測試兩張表是否關聯成功spa

-- 查詢姓名,班級編號,和班級名稱
select s.sname,c.cno,c.cname
from student s
inner join class c
on s.cno=c.cno; 

--問題:能夠在學生表中插入一個不存在的班級
insert into student values(5,'傑克','男',21,1268,3);

解決:使用外鍵:做用:當在子表中插入數據,在父表中不存在,自動報錯
概念:當一張表的某個字段的值須要依賴另一張表的某個字段的值,則使用外鍵約束。
   其中主動依賴的表稱爲子表,被依賴的表稱爲父表。外鍵加在子表中。
使用方法:
  在子表中的字段後直接使用 references 父表名(字段) 例如: cno number(10) references class(cno)
  在建立表語句的最後面使用 constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
  在建立表後使用:alter table 表名 add constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
  刪除外鍵:alter table 表名 drop constraints 外鍵約束名
外鍵選取:
  通常選取父表的主鍵做爲子表的外鍵。
外鍵的缺點:
  沒法直接刪除父表數據,除非級聯刪除
  級聯刪除:在添加外鍵約束時,使用關鍵字 on delete cascade  
    --使用:當刪除父表數據時,自動刪除子表相關全部數據。
    --缺點:沒法保留子表歷史數據。
    --使用關鍵字 on delete set null
      --刪除父表數據時,將子表中的依賴字段的值設置爲null。
      --注意:子表依賴字段不能添加非空約束。code

相關文章
相關標籤/搜索