④MySQL之约束一

1,约束(Constraint)

1.1,什么是约束?常见的约束有哪些?
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束:
    非空约束(not null):约束的字段不能为NULL
    唯一约束(unique):约束的字段不能重复
    主键约束(primary key):约束的字段不既不能为NULL,也不能重复(简称PK)
    外键约束(foreign key):...(简称FK)
    检查约束(check):注意Oracle数据库有check约束,目前mysql不支持该约束。
1.2,非空约束 not null
not null约束只有列级约束,没有表级约束。

    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)
唯一约束修饰的字段具有唯一性,不能重复,但可以为NULL。

    drop table if exists t_user;
    create table t_user(
        id int,
        username varchar(255) unique,
        password varchar(255)
    );

    // 不能重复
    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个列或多个列添加unique
unique(usercode,username);表示usercode,username两个字段联合起来不能重复;【表级约束】
    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出现usercode,username等字段后面是给字段添加唯一性约束【列级约束】
    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,主键约束:(一张表的主键约束只能有一个)
primary key主键约束:不能重复,也不能为NULL。
列级主键约束写法:字段 字段类型 primary key
标记主键约束写法: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
    根据以上测试得出:id添加了主键约束,主键字段中的数据不能重复,也不能为NULL。

主键的作用:
    表的设计三范式中,第一范式就是要求任何一张表都应该有主键。
    主键值是这行记录在这张表当中的唯一标识。

主键的分类
    根据主键字段的字段数量来划分:
        单一主键:推荐使用,常用的
        复合主键:多个字段联合起来添加一个主键约束(不建议使用,复合主键违背三范式)
    根据主键的性质来划分:
        自然主键:主键值最好就是一个和业务没有任何关系的自然数。
        业务主键:主键值和系统的业务挂钩,例如:银行卡卡号,身份证号。 不建议使用,因为以后的业务一旦发生改变,
                主键可能也需要随着发生改变,但有时候没办法改变,因为改变可能会导致主键值重复。

mysql提供的主键值自增长:
    auto_increment:设置一个主键自增长,从1开始,以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,外键约束
关于外键约束的相关术语:
    外键约束:foreign key
    外键字段:添加有外键约束的字段
    外键值:外键字段中的每一个值。
外键可以为NULL
外键引用其他表字段的时候,被引用的字段不一定是主键,但只要要有唯一性(unique)约束。

业务场景:请设计数据库表,用来维护学生和班级信息:
设计两张表(班级表和学生表):
    班级表(t_class)包含信息:
        cno:(pk主键)班级编号
        cname:班级名称

    学生表(t_student)包含信息:
        sno:(pk主键) 学生学号
        sname:学生名字
        classno:(fk主键) 班级编号,引用t_class表中的cno字段。

    以上两张表:t_student中的classno字段引用t_class表中的cno字段,所以t_student是字表,t_class是父表。

操作字表与父表的顺序要求:
    删除数据时,先删字表,再删父表;
    添加数据时,先添父表,再添字表;
    创建表时,先创父表,在创字表;
    删除表时,先删字表,再删父表。

开始sql编写:
    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,'实验中学高一班');
    insert into t_class values(102,'实验中学高二班');

    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,存储引擎

查看当前mysql支持的存储引擎
    show engines \G
2.1什么是存储引擎
存储引擎这个名字只有在mysql中使用,(Oracle中有对应的机制,就是”表的存储方式“)

上篇:③MySQL之DML(数据操作语言)、DDL(数据定义语言)
下篇:⑤MySQL之约束二

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容