1. 程式人生 > >資料庫的基本操作--新增/修改約束以及表結構的修改&序列

資料庫的基本操作--新增/修改約束以及表結構的修改&序列

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. (1)建立唯一約束方法一
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18) unique);
  1. 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);
  1. (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;

整理不易,轉載請註明出處。