④MySQL之約束一

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之約束二

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末只祠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丸升,更是在濱河造成了極大的恐慌铆农,老刑警劉巖牺氨,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狡耻,死亡現(xiàn)場(chǎng)離奇詭異墩剖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)夷狰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)岭皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沼头,你說(shuō)我怎么就攤上這事爷绘。” “怎么了进倍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵土至,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猾昆,道長(zhǎng)陶因,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任垂蜗,我火速辦了婚禮楷扬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贴见。我一直安慰自己烘苹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布片部。 她就那樣靜靜地躺著镣衡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪档悠。 梳的紋絲不亂的頭發(fā)上捆探,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音站粟,去河邊找鬼黍图。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奴烙,可吹牛的內(nèi)容都是我干的助被。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼切诀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揩环!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起幅虑,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丰滑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后倒庵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體褒墨,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炫刷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郁妈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浑玛。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖噩咪,靈堂內(nèi)的尸體忽然破棺而出顾彰,到底是詐尸還是另有隱情,我是刑警寧澤胃碾,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布涨享,位于F島的核電站,受9級(jí)特大地震影響仆百,放射性物質(zhì)發(fā)生泄漏灰伟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一儒旬、第九天 我趴在偏房一處隱蔽的房頂上張望栏账。 院中可真熱鬧,春花似錦栈源、人聲如沸挡爵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茶鹃。三九已至,卻和暖如春艰亮,著一層夾襖步出監(jiān)牢的瞬間闭翩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工迄埃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疗韵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓侄非,卻偏偏與公主長(zhǎng)得像蕉汪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逞怨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容