添加添加約束有兩種方法,一種是在創建表時添加約束,還有一種是創建表后添加約束
一、創建表時添加約束
create table std (
id number(3) primary key,
name varchar2(10),
address varchar2(20)
); 或者
creat table std (
id number(3),
name varchar2(10),
address varchar2(20),
contraint PK_id primary key
);
二、創建表后添加約束
對於唯一、主鍵、檢查、外鍵約束
語法:alter table 表名 add contraint 約束名稱 約束類型 (列名);
舉例:alter table std add contraint NN_name not null(name);
對於非空約束
語法:alter table 表名 motify 列名 constraint 約束名稱 not null;
對於默認約束
語法:alter table 表名 motify 列名 default '自定義的默認值';
刪除約束:
一、對於唯一、主鍵、檢查、外鍵、非空約束
語法:alter table 表名 drop constraint 約束名;
二、對於默認約束
語法:alter table 表名 motify 列名 default null;
外鍵的使用:
一、通過外鍵,可以將兩張表關聯起來,A表中的a列--->B表中的b列,則a為外鍵,b為主鍵
二、語法:constraint FK_子表_外鍵列 foreign key(外鍵列) reference 父表(主鍵列);
create table sub(sid number, sname varchar(10) not null UNIQUE, constraint PK_sid primary key(sid)); --創建課程表 insert into sub values(1,'Java'); insert into sub values(2,'Python'); insert into sub values(3,'C#'); commit; --插入課程表數據
create table student( stuno number(3),stuname varchar2(10), stuaddress varchar2(20),stuid number(3), constraint FK_student_sub foreign key(stuid) references sub(sid)); --創建學生表,同時創建外鍵 insert into student values(1,'張三','廣州市海珠區',1); insert into student values(2,'李四','廣州市天河區',3); insert into student values(3,'王五','廣州市越秀區',1); --插入學生數據
三、注意
1、主表中被引用的必須時主鍵或者唯一
2、子表插入的數據在父表不存在時,會報錯,例如:insert into student values(4,'趙六','廣州市荔灣區',4) --錯誤
3、刪除主表數據時,若關聯的子表存在數據,則刪除失敗
四、外鍵使用建議:
1、當父表中沒有對應數據時,不要向子表增加數據
2、不要更改父表的數據,導致子表孤立
3、建議:在創建外鍵時,直接設置成 級聯刪除 或者 級聯置空
4、刪除表的操作是:先刪除子表,再刪除父表
五、擴展
若父表關聯的子表存在數據,還是先直接刪除父表數據時,可以使用級聯刪除,或者級聯置空
1、級聯刪除:刪除父表數據時,會同時刪除子表中關聯的數據
使用方式:在創建好的外鍵約束后面加上 on delete cascade
create table student(
stuno number(3),stuname varchar2(10),
stuaddress varchar2(20),stuid number(3),
constraint FK_student_sub foreign key(stuid) references sub(sid) on delete cascade
);
2、級聯置空:刪除父表數據時,會將子表中關聯的外鍵值置空,其他字段不影響
使用方式:在創建好的外鍵約束后面加上 on delete set null
create table student( stuno number(3),stuname varchar2(10), stuaddress varchar2(20),stuid number(3), constraint FK_student_sub foreign key(stuid) references sub(sid) on delete set null
);