資料庫的基本操作--新增/修改約束以及表結構的修改&序列
1.約束
表的約束
往表中插入資料的時候,可能出現一些問題,比如:重複插入資料,內容不對(性別)
-------如何保證資料庫表中資料的完整性和一致性呢?約束
常見的約束:
主鍵(primary key),外來鍵(foreign key),唯一(unique),非空(not null),預設(default),使用者自定義(check)
2. 約束分類
-----常見的約束有:
- 主鍵約束(primary key),
- 外來鍵約束(foreign),
- 唯一(unique),非空(not null)
- 預設(default)
- 使用者自定義約束(check)
2.1 primary key 主鍵約束
什麼是主鍵約束? 主鍵約束就是給表定義一個主鍵,什麼是主鍵??
主鍵只要是用來保證表記錄的唯一非空的。
主鍵(PRIMARY KEY )約束:唯一的標識表中的每一行,不能重複,不能為空。 建立主鍵或唯一約束後,ORACLE 會自動建立一個與約束同名的索引(UNIQUENES 為UNIQUE 唯一索引)。需要注意的是:每個表只能有且有一個主鍵約束。
什麼是主鍵約束?主鍵約束就是給表定義一個主鍵,什麼是主鍵?
--主鍵主要是用來保證表記錄的唯一非空的。
建表的時候新增主鍵
create table student(stuno number( 4) primary key,stuname varchar2(10),age number(2),addr varchar(50));
insert into student values(1001,'zhang',18,'luoyang');
再次插入相同記錄,違法主鍵約束,不允許插入
SQL> insert into student values(1001,'zhang',18,'luoyang');
insert into student values(1001,'zhang',18,'luoyang')
ORA-00001: 違反唯一約束條件 (SYS.SYS_C0010797)
如果主鍵為null也不允許插入,同樣是違反了主鍵約束
SQL> insert into student values(null,'zhang',18,'luoyang');
insert into student values(null,'zhang',18,'luoyang')
建立一張課程表:
create table course(cno number(4) primary key,cname varchar2(20),cscore number(2));
–建立一張成績表:學號和課程號共同作為一個主鍵,稱為聯合主鍵
一張表只能有一個主鍵
create table score(sno number(4),cno number(4),score number(5,2),constraint pk_score primary key (sno,cno));
drop table course;
create table course(cno number(4) constraint pk_course primary key ,cname varchar2(20),cscore number(2));
特別說明:不推薦大家使用複合主鍵。
2.2 unique 唯一
唯一(UNIQUE )約束:在表中每一行中所定義的這列或這些列的值都不能相同。必須保證唯一性。否則就會違法約束條件。用於指定列的值不能重複,可以為 null
舉例:
create table user2(id number unique,name varchar2(30));
insert into user2 values(1,111);//id 輸入重複的值是會報錯
注意:oracle 中 中 unique 可以為 null ,而且允許多行為 nul
唯一約束:
–問題:student(sno,sname,age,addr,idcard)主鍵:sno,idcard(身份證號):可以為空,但是如果寫的話要求唯一
–建立唯一約束:
- (1)建立唯一約束方法一
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18) unique);
- 2)建立唯一約束方法二
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18) constraint uk_idcard unique);
- (3)建立唯一約束方法三
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18),constraint uk_idcard unique(idcard));
2.3 not null 非空
非空(NOT NULL )約束:顧名思義,所約束的列不能為 NULL 值。否則就會報錯
舉例:
create table user1(id number,name varchar2(30) not null);
insert into user1 values(001,'');//會報錯
–非空約束和預設約束
create table student(
sno number(4) primary key, --主鍵約束
sname varchar2(20) not null, --非空約束
age number(3) default 18, --預設約束
addr varchar2(50),
idcard number(18) unique); --唯一約束
2.4 foreign key 外來鍵約束 references
外來鍵(FOREIGN KEY )約束:用來維護從表(Child Table)和主表(Parent Table)之間的引用完整性.能夠維護資料庫的資料一致性,資料的完整性。防止錯誤的垃圾資料入庫; 用於定義主表和從表之間的關係,外來鍵約束要定義在從表上,主表則必需具有主鍵約束或是 e unique 約束,當定義外來鍵約束後,要求外來鍵列資料必需在
主表的主鍵列存在或是為 null
外來鍵約束 外來鍵 在另外一張表中是主鍵
student(sno sname,age,addr.udcard) 主鍵sno
course (cno,cname ccouse)主鍵sno
score (sno cno score)主鍵(sno ,cno) 外來鍵:一個是sno 一個是cno
--------外來鍵是做什麼用的?如果student中沒有學號1001學生資訊,那麼score中也不應該有該學生成績
在score插入資料的時候,如果學生student中不存在對應學號或者課程表中不存在對應課程 則不允許插入
create table class(id number primary key,name varchar2(32));
create table stus(id number primary key,
name varchar2(36) not null,
classid number references class(id)
);
特別說明:froeign key 外來鍵的細節
1 、外來鍵指向主鍵列;
2 、外來鍵可以指向 unique 列;
3 、建表時先建主表,再建從表;刪除表先刪從表,再刪主表。
4 、外來鍵列屬性值要與主鍵或 unique 列屬性值的型別保持一致
5 、外來鍵列的值,必需在主鍵列中存在。但外來鍵列的值允許為 null
**外來鍵約束:
外來鍵:在另外一張表中是主鍵**
–student(sno,sname,age,addr,idcard) 主鍵:sno
–course(cno,cname,cscore) 主鍵:cno
–score(sno,cno,score)主鍵: (sno,cno) 外來鍵:sno 外來鍵: cno
外來鍵做什麼用?如果student表中沒有1001學生資訊,那麼score表中也不應該有該學生的成績。
往成績表插入資料的時候,如果學生表中不存在對應的學號,或者課程表中不存在對應的課程,則不允許插入
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18));
create table course(
cno number(4)primary key,
cname varchar2(20),
cscore number(2));
1.建立外來鍵約束的第一種方式
create table score(
stuno number(4) references student(sno), --建立第一個外來鍵約束
couno number(4) references course(cno), --建立第二個外來鍵約束
score number(5,2),
constraint pk_score primary key(stuno,couno)); --建立一個主鍵約束
2.建立外來鍵約束的第二種方式
create table score(
stuno number(4) constraint fk_stuno references student(sno), --建立第一個外來鍵約束
couno number(4) constraint fk_couno references course(cno), --建立第二個外來鍵約束
score number(5,2),
constraint pk_score primary key(stuno,couno));
3.建立外來鍵約束的第三種方式
create table score(stuno number(4),
couno number(4),
score number(5,2),
constraint fk_stuno foreign key(stuno) references student(sno),
constraint fk_couno foreign key(couno) references course(cno),
constraint pk_score primary key(stuno,couno));
外來鍵約束總結
–總結1:在一張表中只能有一個主鍵,但是可以有多個外來鍵。
–總結2:作為外來鍵的欄位名,不一定必須和被參考表一致。
–總結3:定義了外來鍵約束之後,往表中插入一條記錄,外來鍵值會參考其父表中主鍵的值,只有父表中存在該值才能插入成功
–往student表中插入3條記錄
insert into student values(1001,'zhangsan',19,'henanluoyang',98765432123456789);
insert into student values(1002,'lisi',19,'henanluoyang',98765432123456789);
insert into student values(1003,'wangwu',19,'henanluoyang',98765432123456789);
檢視student表中所有內容
select * from student;
檢視course表中所有記錄
select * from course;
–思考:insert into score values(1003,9997,89);能成功嗎?不能,因為course表中不存在課程號為9997的課程
–思考:insert into score values(1003,9998,89);能成功嗎?可以,因為1003在student表中存在,9998在course表中存在
–總結4:定義外來鍵約束之後,刪除父表中的記錄,需要先將相關子表的記錄刪除
delete from student where sno=1003; --刪除不掉,提示: 違反完整約束條件 (SYS.SYS_C0010808) - 已找到子記錄
--正確的做法:
delete from score where stuno=1003; --先刪子記錄
delete from student where sno=1003; --後刪父記錄
2.5 check 檢查,使用者自定義約束
條件(CHECK )約束:表中每行都要滿足該約束條件。條件約束既可以在表一級定義
也可以在列一級定義。在一列上可以定義任意多個條件約束
舉例:
create table user4(id number primary key,
sal number check(sal>=1000 and sal<=2000),
sex char(2) check(sex in('男','女')));
insert into user4 values(1,1000,' 男');//sal 列的值不滿足 1000 至 至 2000
使用者自定義約束(檢查約束)
check(約束條件)
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3) default 18 check(age between 10 and 45), ---定義學生年齡預設為18,自定義約束條件為在10到45歲之間
addr varchar2(50),
idcard number(18) unique); ------身份證號唯一性約束條件
定義學生性別必須為男或者女
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
gender char(2) check(gender in('男','女')), -------定義學生性別必須為男或者女
age number(3) default 18 check(age between 10 and 45),
addr varchar2(50),
idcard number(18) unique);
總結:定義了完整性約束之後,表中記錄的插入,刪除,修改必須符合表的完整性約束條件,
如果違反了完整性約束條件,則不允許操作
二、Oracle修改表結構
修改表結構
–問題:給student表新增欄位regdate型別是date;
alter table student add regdate date;
alter table student add province varchar2(350);
刪除剛才新增的欄位
alter table student drop column regdate;
alter table student drop(province,regdate);
–修改欄位型別和長度
alter table student modify idcard char(18);
alter table student modify idcard char(20);
修改表名
alter table student rename to stu;
修改欄位名
alter table stu rename column gender to sex;
4.給表新增約束
知識點4:如果建表的時候,沒有新增約束,那麼建好表之後,如何給表新增約束?
drop table stu cascade constraints;
create table student(
sno number(4),
sname varchar2(20),
gender char(2),
age number(3),
addr varchar2(50),
idcard number(18));
–新增主鍵約束
alter table student add constraint pk_sno primary key(sno);
–新增唯一約束
alter table student add constraint uk_idcard unique(idcard);
–新增檢查約束
alter table student add constraint ck_age check(age between 18 and 50);
–新增非空約束
alter table student modify sname not null;
–新增預設約束
alter table student modify age default 18;
create table score(sno number(4),score number(5,2));
–新增外來鍵約束
alter table score add constraint fk_sno foreign key(sno) references student(sno);
–禁止某個約束
alter table score disable constraint fk_sno;
–啟用某個約束
alter table score enable constraint fk_sno;
–刪除約束
alter table score drop constraint fk_sno;
–刪除student表的主鍵約束:
alter table student drop primary key;
5.序列
–序列是什麼?有序的數字組成的一個排列 1 2 3 4 5 6 7
–做什麼用?序列是一個獨立的資料庫物件,主要用來生成主鍵
–怎麼用?
–建立序列:
create sequence seq01 --seq01序列名
start with 3 --序列的起始值
increment by 1 --步長
maxvalue 9999 --序列的最大值
minvalue 0 --序列的最小值
nocycle --nocycle(表示序列不迴圈)|cycle(表示序列迴圈使用)
cache 20; --cache 20(為了加快序列的生成速度,每次生成20個值,放到快取中)|nocache(不往快取中存放序列值,使用一次,生成一次)
–currval:返回序列的當前值,不會引起序列自增
–nextval:返回序列的下一個值,會引起序列自增
–檢視序列的下一個值,會引起序列自增
select seq01.nextval from dual;
–第一次使用序列的時候,必須使用 序列名.nextval
–檢視序列的當前值
select seq01.currval from dual;
–序列的使用:
insert into student values(seq01.nextval,'zhang','男',18,'河南信陽','123456789987654321');
如果下一個表還要引用這個序列則接著這個序列自動增加。
–注意事項:一個sequence可以供多張表使用的。可能造成主鍵值的不連續。
–刪除序列:
drop sequence seq01;
整理不易,轉載請註明出處。