Oralce的表建立操作&&約束
阿新 • • 發佈:2018-12-15
--------------------------------------------------------------------------------------------------------------- ------Oracle的二維表管理 ----建立表,並新增約束, ----主鍵約束 ----非空越是 ----檢查約束 ----唯一約束 ----資料型別: ---number型別 ------整數number(a) 浮點數number(a,b) -----數值型別,number(a,b)總長度為a,小數長度為b,小數位可以不寫 ---varchar2型別 ------字元型別 varchar2(ln) ln表示的是字元的最大長度,實際儲存的記憶體長度是根據字元大小來分配的,但是最大長度不能超過ln,vachar2效率低 -------特點:動態分配儲存空間,儲存效率低(不用判斷字元的長度) ---char型別 ------字元型別 char(ln) 不管字元有多大,都開闢ln的空間 char的儲存效率高 ------特點:直接開闢指定大小空間,儲存效率高 ----date型別 create table student( sno number(10,2), sname varchar2(100), sage number(3), ssex char(4), sfav varchar2(100), sbirth date ); ----維護表 ----新增資料 insert into student values(1,'柳巖',18,'z','拍電影','01-1月-1985') insert into student values(2,'古力娜扎',18,'z','拍電視劇',to_date('1997-06-07','yyyy-mm-dd')) select * from student ----刪除表 drop table student ---------------------------------------------------------- create table student( sno number(10) primary key, sname varchar2(100), sage number(3), ssex char(4), sfav varchar2(500), sbirth date, sqq varchar(30) ) select * from student ----建立表約束學習 ---問題1:學號重複依然可以新增 insert into student values(1,'關曉彤',18,'女','拍電影',to_date('1997-07-05','yyyy-mm-dd'),'1065463483') insert into student values(1,'關曉彤001',18,'女','拍電影',to_date('1997-07-05','yyyy-mm-dd'),'1065463483') select * from student ---問題2:姓名為空 insert into student values(1,'',18,'女','拍電影',to_date('1997-07-05','yyyy-mm-dd'),'1065463483') select * from student ----問題3:年齡超出正常範圍 insert into student values(1,'',300,'女','拍電影',to_date('1997-07-05','yyyy-mm-dd'),'1065463483') select * from student -----問題4:性別可以為任意字元 insert into student values(1,'',18,'a','拍電影',to_date('1997-07-05','yyyy-mm-dd'),'1065463483') select * from student ----問題5:QQ號竟然可以重複 ------------------------------------------- -----解決問題1:新增主鍵(非空唯一) ---使用: ----1.直接在欄位後面使用primary key create table student( sno number(10) primary key, sname varchar2(100), sage number(3), ssex char(4), sfav varchar2(500), sbirth date, sqq varchar(30) ) ----2.在建立表的語句最後面新增constraints pk_表名_欄位名 primary key(被約束欄位名) create table student( sno number(10) primary key, sname varchar2(100), sage number(3), ssex char(4), sfav varchar2(500), sbirth date, sqq varchar(30), constraints pk_student_sno primary key(sno)----新增約束 ) -----3.在外面新增元件約束alter table student add constraint pk_表名_欄位名 primary key(被約束欄位名) alter table student add constraints pk_student_sno primary key(sno) -----刪除主鍵約束 alter table student frop constraints pk_student_sno ------解決問題2:使用非空約束 ----1.直接在欄位後面使用not null ----2,在建立表的結尾使用 constraints pk_表名_欄位名 check(欄位名 is not null) ----3.在表的外面使用 alter table student add constraints pk_表名_欄位名 check(欄位名 is not null) -----4.刪除約束 alter table student drop constraints pk_欄位名_表名 ------解決問題3:新增檢驗約束 -----1.直接在欄位的後面使用 check(條件) -----2.在建立表的結尾最後面使用 constraints pk_表名_欄位名 check(條件) -----3.在建立表外使用 alter table student add constraints pk_表名_欄位名 check(條件) -------解決問題4:使用檢查約束 -----1.在建立欄位的後面使用 check(條件) -----2.在建立表的結尾最後使用 constraints ck_表名_欄位名 check(條件) -----3.在建立表的外面使用alter table student add constraints ck_表名_欄位名 check(條件) ------4刪除主鍵約束 alter table student drop constraints ck_表名_欄位名 -------解決問題5:使用唯一約束條件 ----1.直接在欄位的後面使用unique ----2.在建立表的結尾最後使用 constraints un_表名_欄位名 unique(欄位名) ----3.在表的外面使用 alter table student add constraints un_表名_欄位名 unique(欄位名) ----4.刪除唯一約束 alter table student drop constraints un_表名_欄位名 ------------------------------------------外來鍵約束------------------------------------------- ----建立學生表 drop table student create table student( sno number(10) primary key, sname varchar2(100) not null, sage number(3) check(sage>0 and sage<100), ssex varchar2(4) check(ssex='男' or ssex='女'), sfav varchar2(100), sqq varchar2(30) unique, cid number(10), constraints fk_student_cid foreign key(cid) references clazz (cid) on delete cascade ) ----新增資料 insert into student values(2,'李四',18,'男','看電影','222222',1); insert into student values(3,'王五',18,'男','看電影','333333',2); insert into student values(4,'趙柳',18,'男','看電影','444444',2); select * from student ----建立班級表 create table clazz( cid number(10) primary key, cname varchar2(100) not null, cdes varchar2(100) ) ----新增資料 insert into clazz values(1,'java','就業'); insert into clazz values(2,'python','就業'); select * from clazz select * from student s inner join clazz c on s.cid=c.cid; insert into student values(1,'張三',28,'男','唱歌','333333',5) -------新增外來鍵 ----遇到的問題:竟然可以在student'表中天機一個不存在的班級 ----使用外來鍵: ----作用:當在子表中插入不存在的話會自動報錯 ----概念: -----當一張表的欄位需要依賴另一張表的欄位,則使用外來鍵約束 -----其中主動依賴的表為子表,被依賴的表為父表 -----使用: ------1.在欄位後面直接使用references 父表名(欄位) ------2.在建立表的最後使用 constrains fk_子表名_欄位名 foreign key(子表字段名) reference 父表名(父表字段) ------3.在建立表的外面使用 alter table student add constrains fk_子表名_欄位名 foreign key(子表字段名) reference 父表名(父表字段) ------4.刪除外來鍵 alter table student drop constraints fk_子表名_欄位名 -----外來鍵選取 -------父表的主鍵作為子表的外來鍵 -----外來鍵的缺點: ----1.無法刪除父表的資料 -----級聯刪除,在新增外來鍵的約束的時候,新增關鍵字 ------缺點:無法保留子表資料 ------關鍵字on delete set null ----刪除父表資料的時候,將子表的依賴欄位值設為null -----注意:子表依賴欄位不能新增非空約束 delete from clazz where cid=1 select * from student delete from clazz where cid=1