Oracle實戰練習(續三)

   #數據庫常用對象
#1. 建立表
create table stu(
 id number(6),
 name varchar2(20),
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);

#2.刪除表
drop table stu;

#3.五個約束條件
#(1)非空約束(not null)  (這裏name not null)
create table stu(
 id number(6),
 name varchar2(20) not null,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);
#可以定義字段級約束,也可以定義表級約束
create table stu(
 id number(6),
 name varchar2(20) constraint stu_name_nn not null,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);
name constraint stu_name_nn not null
如果在name字段中插入一個null值,則會出現如下錯誤:無法將 NULL 插入 ("DYS"."STU"."NAME");

#(2)唯一約束(unique)
create table stu(
 id number(6) unique,
 name varchar2(20) constraint stu_name_nn not null,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);
如果在id字段中插入重複的值,則會顯示如下錯誤:違反唯一約束條件
字段級約束,缺點是如果設兩個字段爲約束條件,則不能實現目的
create table stu(
 id number(6) ,
 name varchar2(20) ,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50),
 constraint uq_stu_unique unique(id, email)
);
constraint uq_stu_unique unique(id, email), 這樣設的話可以把兩個字段聯合在一起.
唯一約束中的表級約束
constraint stu_name_email_unique unique(name, email);
#(3)主鍵約束(primary key)
主鍵(primary key),可以唯一標識整條記錄,非空且唯一.
create table stu(
 id number(6) primary key,
 name varchar2(20) ,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);
#(4)外鍵約束(foreign key)
create table class (
 id number(4) primary key,
 name varchar2(20) not null
);
create table stu(
 id number(6) primary key,
 name varchar2(20) ,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4) references class(id),
 email varchar2(50)
);
class number(4) references class(id) 這條是表stu的外鍵參照表class的主鍵
如果向表stu插入數據的時候,insert into stu(id,name,class, email)values(1,'a',1000,'a');
則會出現如下錯誤:違反完整約束條件 (DYS.SYS_C005763) - 未找到父項關鍵字
表級約束:
constraint stu_class_fk foreign key(class) references class(id),
create table stu(
 id number(6) primary key,
 name varchar2(20) ,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4) ,
 email varchar2(50),
 constraint stu_class_fk foreign key(class) references class(id)
);
先向表class中插入數據: insert into class values(1000,'LI');
再向表stu中插入數據:   insert into stu(id,name,class, email) values(1,'a',1000,'a');
被參考的字段必須是主鍵
#(5)check約束
delete from class where id = 1000;   #這個值被參考了,(違反完整約束條件)

#4.修改表結構
alter table stu add(addr varchar2(100)); #增加字段
alter table stu drop(addr);
alter table stu add(addr varchar2(100));
alter table stu modify(addr varchar2(150)); #修改字段
注意:修改後的精度必須能允許先前的精度, 比如number(50)--> number(25), 可能會截取了一些數據.
增加或者刪除約束條件:
delete from class;  #不能刪,因爲違反完整約束條件 (DYS.STU_CLASS_FK),有外鍵約束
如果把約束條件刪除了後可以刪除表中的數據
alter table stu drop constraint stu_class_fk;
然後再刪除表中的數據
delete from class; #這時就可以刪除了


#5.數據字典
 desc user_tables;
 #查看有什麼表
 select table_name from user_tables;
 #查看有哪些視圖
 select view_name from user_views;
 #查看有哪些約束條件
 select constraint_name from user_constraints;
 #顯示約束條件的結構
 desc user_constraints;
#數據字典存在一個表中,這個表稱爲dictionary
 #顯示數據字典表中的結構
 desc dictionary;
 #查看數據字典中的表
 select table_name from dictionary;
 select table_name from dictionary where table_name like 'USER%'order by tab
le_name;

#6.索引
  desc stu;
 #創建索引
  create index idx_stu_email on stu(email);
 #刪除索引
  drop index idx_stu_email;
 #從數據字典中查看有哪些索引
  select index_name from user_indexes;
 #建立索引後,插入數據慢了,因既要在表中插入數據,又要在索引中插入, 但是讀數據卻比較快. 索引也會佔用空間,不要輕易建立.
 
#7.視圖
  #視圖, 就是子查詢
  #建立索引
   create view v$_stu as select id, name, age from stu;
  #查看索引
   desc v$_stu;
  #查看數據字典中的視圖
  select view_name from user_views;
  desc v$dept_avg_sal_info;
  #視圖是可以更新數據的.一般不建議在視圖中更新數據.
 
#8.序列
  #序列是oracle數據庫中獨特的,產生唯一的不間斷的序列, 一般用作主鍵
  #創建表
   create table article(id number, title varchar2(1024), content long);
  #創建索引
   create sequence seq; #此時會出現權限不足的現象
  #連接到數據庫管理員
   conn sys/dys as sysdba;
  #授權給用戶創建序列的權限
   grant create sequence to dys;
  #然後再創建序列
   create sequence seq;
 #序列在內部已經作好了線程同步了,不會出現數據不一致的現象
  #查看序列的下一個值
   select seq.nextval from dual;   
  #向表article中插入數據
   insert into article values(seq.nextval, 'a', 'b');
  #查看錶article中的數據
   select * from article;
  #刪除序列
   drop sequence seq;
  #一個序列對應於一個字段
 
 #9.數據庫的三範式
  #數據庫設計的三範式,是要追求不存在冗餘字段, 同樣的數據不存在第二遍
  #範式:是數據庫設計的規則
 #第一範式的第一要求是要有主鍵,第二要求是列不可分,即在列上不能重複. 比如出生年月和年齡, 這是一種重複
 #第二範式:當一張表中有多個字段組合作爲主鍵時,非主鍵的字段不能夠依賴於部分主鍵.
 #第三範式:存在傳遞依賴
 #在設計數據庫時只要做到三範式就可以了.
 
 
 
     

 

 

 

 

 

 

發佈了61 篇原創文章 · 獲贊 9 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章