1. 程式人生 > >Oralce的表建立操作&&約束

Oralce的表建立操作&&約束

---------------------------------------------------------------------------------------------------------------
------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