1旨巷,約束(Constraint)
1.1球散,什么是約束尿赚?常見(jiàn)的約束有哪些?
在創(chuàng)建表的時(shí)候蕉堰,可以給表的字段添加相應(yīng)的約束凌净,添加約束的目的是為了保證表中數(shù)據(jù)的合法性、有效性屋讶、完整性冰寻。
常見(jiàn)的約束:
非空約束(not null):約束的字段不能為NULL
唯一約束(unique):約束的字段不能重復(fù)
主鍵約束(primary key):約束的字段不既不能為NULL,也不能重復(fù)(簡(jiǎn)稱PK)
外鍵約束(foreign key):...(簡(jiǎn)稱FK)
檢查約束(check):注意Oracle數(shù)據(jù)庫(kù)有check約束皿渗,目前mysql不支持該約束斩芭。
1.2,非空約束 not null
not null約束只有列級(jí)約束羹奉,沒(méi)有表級(jí)約束秒旋。
drop table if exists t_user;
create table t_user(
id int,
username varchar(255) not null,
password varchar(255)
);
insert into t_user(id,password) values(123,'123456');
// ERROR 1364 (HY000): Field 'username' doesn't have a default value
insert into t_user values(1234,'xiaohua','233333');
1.3,唯一性約束(unique)
唯一約束修飾的字段具有唯一性诀拭,不能重復(fù)迁筛,但可以為NULL。
drop table if exists t_user;
create table t_user(
id int,
username varchar(255) unique,
password varchar(255)
);
// 不能重復(fù)
insert into t_user values(1234,'xiaohua','233333');
insert into t_user values(1234,'xiaohua','233333');
// ERROR 1062 (23000): Duplicate entry 'xiaohua' for key 't_user.username'
//可以為NULL耕挨。
insert into t_user(id) values(2);
insert into t_user(id) values(3);
insert into t_user(id) values(4);
給2個(gè)列或多個(gè)列添加unique
unique(usercode,username);表示usercode,username兩個(gè)字段聯(lián)合起來(lái)不能重復(fù);【表級(jí)約束】
drop table if exists t_user;
create table t_user(
id int,
usercode varchar(255),
username varchar(255),
unique(usercode,username)
);
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
insert into t_user values(3,'222','zs');
select * from t_user;
insert into t_user values(3,'111','zs');
// ERROR 1062 (23000): Duplicate entry '111-zs' for key 't_user.usercode'
unique出現(xiàn)usercode,username等字段后面是給字段添加唯一性約束【列級(jí)約束】
drop table if exists t_user;
create table t_user(
id int,
usercode varchar(255) unique,
username varchar(255) unique
);
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
//ERROR 1062 (23000): Duplicate entry '111' for key 't_user.usercode'
1.4细卧,主鍵約束:(一張表的主鍵約束只能有一個(gè))
primary key主鍵約束:不能重復(fù),也不能為NULL筒占。
列級(jí)主鍵約束寫(xiě)法:字段 字段類(lèi)型 primary key
標(biāo)記主鍵約束寫(xiě)法:primary key(字段1,字段2,...)
drop table if exists t_user;
create table t_user(
id int primary key,
username varchar(255) unique,
email varchar(255)
);
insert into t_user values(1,'zs','zs@123.com');
insert into t_user values(2,'ls','ls@123.com');
insert into t_user values(3,'zsl','zsl@123.com');
select * from t_user;
insert into t_user values(1,'jack','jack@123.com');
// ERROR 1062 (23000): Duplicate entry '1' for key 't_user.PRIMARY'
insert into t_user(username,email) values('jack','jack@123.com');
// ERROR 1364 (HY000): Field 'id' doesn't have a default value
根據(jù)以上測(cè)試得出:id添加了主鍵約束贪庙,主鍵字段中的數(shù)據(jù)不能重復(fù)励七,也不能為NULL雨席。
主鍵的作用:
表的設(shè)計(jì)三范式中,第一范式就是要求任何一張表都應(yīng)該有主鍵欢摄。
主鍵值是這行記錄在這張表當(dāng)中的唯一標(biāo)識(shí)奏窑。
主鍵的分類(lèi)
根據(jù)主鍵字段的字段數(shù)量來(lái)劃分:
單一主鍵:推薦使用导披,常用的
復(fù)合主鍵:多個(gè)字段聯(lián)合起來(lái)添加一個(gè)主鍵約束(不建議使用,復(fù)合主鍵違背三范式)
根據(jù)主鍵的性質(zhì)來(lái)劃分:
自然主鍵:主鍵值最好就是一個(gè)和業(yè)務(wù)沒(méi)有任何關(guān)系的自然數(shù)埃唯。
業(yè)務(wù)主鍵:主鍵值和系統(tǒng)的業(yè)務(wù)掛鉤撩匕,例如:銀行卡卡號(hào),身份證號(hào)墨叛。 不建議使用止毕,因?yàn)橐院蟮臉I(yè)務(wù)一旦發(fā)生改變模蜡,
主鍵可能也需要隨著發(fā)生改變,但有時(shí)候沒(méi)辦法改變扁凛,因?yàn)楦淖兛赡軙?huì)導(dǎo)致主鍵值重復(fù)忍疾。
mysql提供的主鍵值自增長(zhǎng):
auto_increment:設(shè)置一個(gè)主鍵自增長(zhǎng),從1開(kāi)始谨朝,以1遞增.
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
username varchar(255)
);
insert into t_user(username) values('a');
insert into t_user(username) values('b');
insert into t_user(username) values('c');
insert into t_user(username) values('d');
insert into t_user(username) values('e');
select * from t_user;
1.5膝昆,外鍵約束
關(guān)于外鍵約束的相關(guān)術(shù)語(yǔ):
外鍵約束:foreign key
外鍵字段:添加有外鍵約束的字段
外鍵值:外鍵字段中的每一個(gè)值。
外鍵可以為NULL
外鍵引用其他表字段的時(shí)候叠必,被引用的字段不一定是主鍵荚孵,但只要要有唯一性(unique)約束。
業(yè)務(wù)場(chǎng)景:請(qǐng)?jiān)O(shè)計(jì)數(shù)據(jù)庫(kù)表纬朝,用來(lái)維護(hù)學(xué)生和班級(jí)信息:
設(shè)計(jì)兩張表(班級(jí)表和學(xué)生表):
班級(jí)表(t_class)包含信息:
cno:(pk主鍵)班級(jí)編號(hào)
cname:班級(jí)名稱
學(xué)生表(t_student)包含信息:
sno:(pk主鍵) 學(xué)生學(xué)號(hào)
sname:學(xué)生名字
classno:(fk主鍵) 班級(jí)編號(hào)收叶,引用t_class表中的cno字段。
以上兩張表:t_student中的classno字段引用t_class表中的cno字段共苛,所以t_student是字表判没,t_class是父表。
操作字表與父表的順序要求:
刪除數(shù)據(jù)時(shí)隅茎,先刪字表澄峰,再刪父表;
添加數(shù)據(jù)時(shí)辟犀,先添父表俏竞,再添字表;
創(chuàng)建表時(shí)堂竟,先創(chuàng)父表魂毁,在創(chuàng)字表;
刪除表時(shí)出嘹,先刪字表席楚,再刪父表。
開(kāi)始sql編寫(xiě):
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int primary key,
cname varchar(255)
);
create table t_student(
sno int primary key,
sname varchar(255),
classno int,
foreign key(classno) references t_class(cno)
);
insert into t_class values(101,'實(shí)驗(yàn)中學(xué)高一班');
insert into t_class values(102,'實(shí)驗(yàn)中學(xué)高二班');
insert into t_student values(10001,'馬小虎',101);
insert into t_student values(10002,'張小龍',101);
insert into t_student values(10003,'劉紅',102);
insert into t_student values(10004,'李思思',102);
insert into t_student values(10005,'jack',102);
insert into t_student values(10006,'kitty',103);
// ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`sqltest`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
外鍵可以為NULL
insert into t_student(sno,sname) values(10007,'外鍵可以為null');
2税稼,存儲(chǔ)引擎
查看當(dāng)前mysql支持的存儲(chǔ)引擎
show engines \G
2.1什么是存儲(chǔ)引擎
存儲(chǔ)引擎這個(gè)名字只有在mysql中使用烦秩,(Oracle中有對(duì)應(yīng)的機(jī)制,就是”表的存儲(chǔ)方式“)
上篇:③MySQL之DML(數(shù)據(jù)操作語(yǔ)言)郎仆、DDL(數(shù)據(jù)定義語(yǔ)言)
下篇:⑤MySQL之約束二