Oralce的二維表操作:主鍵約束、非空約束、檢查約束、唯一約束、外鍵約束

原文鏈接:https://blog.csdn.net/weixin_44771312/article/details/98996452

Oralce的二維表操作
    --創建表並同時添加約束
      --主鍵約束
      --非空約束
      --檢查約束
      --唯一約束
      --外鍵約束

    --簡單的表創建和字段類型
    --簡單的創建語句:
      create table student(
           sno number(10) ,--primary key
           sname varchar2(100) ,--not null
           sage number(3), --check(sage<150 and sage>0)
           ssex char(4) ,--check(ssex='男' or ssex='女')
           sfav varchar2(500),
           sbirth date,
           sqq varchar2(30) --unique
           --constraints pk_student_sno primary key(sno)--添加主鍵約束
           --constraints ck_student_sname check(sname is not null)--非空約束
           --constraints ck_student_sage check(sage<150 and sage>0)--檢查約束
           --constraints ck_student_ssex check(ssex='男' or ssex='女')--檢查約束
           --constraints un_student_sqq unique(sqq)--唯一約束
      )   
      --添加主鍵約束
       alter table student add  constraints pk_student_sno primary key(sno);
       alter table student drop  constraints pk_student_sno;
     --添加非空約束
        alter table student add  constraints ck_student_sname check(sname is not null);
         alter table student drop  constraints ck_student_sname;
      --添加檢查約束
      alter table student add constraints ck_student_sage check(sage<150 and sage>0)
      alter table student drop  constraints ck_student_sage;
      --添加檢查約束校驗性別
       alter table student add constraints ck_student_ssex check(ssex='男' or ssex='女')
       alter table student drop  constraints ck_student_ssex;
       --添加唯一約束
       alter table student add constraints un_student_sqq unique(sqq)
       select * from student
       drop table student

二維表創建約束學習問題:
    --問題1:學號重複依然可以添加
       insert into student values(1,'關曉彤',18,'女','拍電影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
       insert into student values(1,'關曉彤001',18,'女','拍電影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
    --問題2:竟然可以沒有名字
       insert into student values(2,'',18,'女','拍電影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
    --問題3:年齡竟然可以超過200歲
       insert into student values(3,'關曉彤002',300,'女','拍電影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
    --問題4:性別竟然可以爲任意字符
       insert into student values(4,'關曉彤',18,'a','拍電影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
    --問題5:qq號竟然可以重複
       insert into student values(5,'關曉彤003',18,'女','拍電影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
       insert into student values(6,'關曉彤004',18,'女','拍電影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
---問題解決:
    --問題1:添加主鍵,主鍵特點:非空唯一
       --使用:
            --直接在創建表的字段後使用 primary key
            --在創建表的語句的最後面使用 constraints pk_表名_字段名 primary key(字段名)
            --在創建表後使用 alter table 表名 add  constraints pk_表名_字段名 primary key(字段名);
            --刪除主鍵     alter table student drop  constraints 主鍵的約束名;
    --問題2:使用非空約束
       --使用:
            --直接在創建表的字段後使用 not null 關鍵字
            --在創建表的語句的最後面使用 constraints ck_表名_字段名 check(字段名 is not null)
            --在創建表後使用 alter table 表名 add  constraints ck_表名_字段名 check(字段名 is not null);
            --刪除非空約束 alter table student drop  constraints 非空約束名;
    --問題3:使用檢查約束
            --直接在創建表的字段後使用 check(條件) 例如      sage number(3) check(sage<150 and sage>0),
            --在創建表的語句的最後面使用 constraints ck_表名_字段名 check(條件)
            --在創建表後使用 alter table 表名 add  constraints ck_表名_字段名 check(條件);
            --刪除檢查約束 alter table student drop  constraints 檢查約束名;

    --問題4:使用檢查約束
            --直接在創建表的字段後使用 check(條件)
            --在創建表的語句的最後面使用 constraints ck_表名_字段名 check(條件)
            --在創建表之後使用alter table 表名 add  constraints ck_表名_字段名 check(條件);
            --刪除檢查約束 alter table 表名 drop  constraints 檢查約束名;
    --問題5:使用唯一約束
            --直接在創建表的字段後使用 unique
            --在創建表的語句後面使用 constraints un_表名_字段名 unique(字段名);
            --在創建表後使用 alter table 表名 add  constraints un_表名_字段名 unique(字段名);
            --刪除約束:alter table 表名 drop  constraints 唯一約束名;

二維表創建 外鍵約束學習:
   --創建學生表
   create table student(
         sno number(10) primary key,
         sname varchar2(100) not null,
         sage number(3) check(sage>0 and sage<150),
         ssex char(4) check(ssex='男' or ssex='女'),
         sfav varchar2(500),
         sqq varchar2(30) unique,
         cid number(10) --references clazz(cno)
         --constraints fk_student_cid foreign key(cid) references clazz(cno)--外鍵
      )
      --添加外鍵
      alter  table student add constraints fk_student_cid foreign key(cid) references clazz(cno) on delete set null
      alter  table student drop constraints fk_student_cid
      drop table student
      --添加測試數據
      insert into student values(1,'張三001',18,'男','唱歌','657889900',1);
      insert into student values(2,'張三002',18,'男','唱歌','657889901',1);
      insert into student values(3,'李四001',18,'男','唱歌','657889903',2);
      insert into student values(4,'李四002',18,'男','唱歌','657889904',2);
   --創建班級表
      create table clazz(
       cno number(10) primary key,
       cname varchar2(100) not null,
       cdesc varchar2(300)
      
      )
      --添加測試數據
       insert into clazz values(1,'java高薪就業班','6666');
       insert into clazz values(2,'python高薪就業班','33333');
  --查詢學生及其班級信息
      select * from student  s
      inner join clazz c
      on s.cno=c.cno
  --問題:竟然可以在學生表中插入一個不存在班級
      insert into student values(5,'李四003',18,'男','唱歌','657889905',3);
  --使用外鍵:
      --作用:當在子表中插入的數據在父表中不存在,則會自動報錯。
      --概念:當一張表的某個字段的值需要依賴另外一張表的某個字段的值,則使用外鍵約束。
             --其中主動依賴的表稱爲子表,被依賴的表稱爲父表。外鍵加在子表中。
      --使用:
             --在子表中的字段後直接使用   references 父表名(字段) 例如: cid number(10) references clazz(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。
                           --注意:子表依賴字段不能添加非空約束。
           --刪除班級1的信息
           select * from student
           delete from clazz where cno=1

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