mysql约束

MySQL约束

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

1.非空约束 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(1,'123');

在这里插入图片描述
这里的1364 是错误编码,每个错误编码不同

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

2,唯一约束 unique

*唯一约束修饰的字段不能重复,**但可以为null**
*案例:
drop table if exists t_user;
create table t_user(
        id int,
        username varchar(255)unique
    );
insert into t_user values(1,'zhangsan');插入成功
insert into t_user values(2,'zhangsan');没插进去![在这里插入图片描述](https://img-blog.csdnimg.cn/20201003091859630.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDIyMTA3OQ==,size_16,color_FFFFFF,t_70#pic_center)

当字段是null的时候可以重复的因为null表示空并不是一个值

insert into t_user(id) values(4);
insert into t_user(id) values(5);
insert into t_user(id) values(6);

在这里插入图片描述

*案例:给两个列或者多个列添加unique

drop table if exists t_user;
create table t_user(
        id int,
        usercode varchar(255),
        username varchar(255),
        unique(username,usercode)//多个字段联合添加约束unique,两个字段联合起来不能重复//**表级约束**
    );
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
insert into t_user values(3,'222','zs');

在这里插入图片描述

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');
        报错,第二条数据添加不进去

注意:非空约束not null没有表级定义方式,只有列级约束没有表级约束,只能加在字段的后面

3.主键约束primary key

*怎么给一张表添加主键约束?
drop table if exists t_user;
        create table t_user(
        id int primary key,
        username varchar(255),
        email varchar(255)
        );
insert into t_user(id,username,email) values(1,'zs','zs@123.com');
insert into t_user(id,username,email) values(2,'ls','ls@123.com');
insert into t_user(id,username,email) values(3,'ww','ww@123.com');

在这里插入图片描述

insert into t_user(id,username,email) values (1,‘jack’,‘jack@123.com’);
在这里插入图片描述
由以上测试结果可以得出:

id是主键,因为添加了主键约束,主键中的数据不能为null,也不能重复。

主键的特点:

    不能是空也不能重复

主键的相关术语:

主键约束(primary key)
主键字段(带有主键约束的字段)
主键值(主键字段中插入的值)

*主键的作用:

-表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
-主键的作用:主键值是这行记录在这张表中的唯一标识。(就像一个人的身份证一样)

主键的分类:

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

注意:一张表的主键约束只能有一个(必须记住) *采用表级约束方式定义主键

drop table if exists t_user;
create table t_user(
        id int,
        username varchar(255),
        primary key(id)
        );
insert into t_user(id,username) values (1,'zs');
insert into t_user(id,username) values (2,'ls');
insert into t_user(id,username) values (3,'ww');
insert into t_user(id,username) values (4,'cs');
select * from t_user;

在这里插入图片描述

 insert into t_user(id,username) values(4,'cx');

id重复了
在这里插入图片描述

*mysql提供的主键值自增(非常重要):

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');
insert into t_user(username) values('f');
select * from t_user;

在这里插入图片描述

提示:Oracle 中也提供了一个自增机制,叫做:序列(sequence)

4,外键约束(foreign key)

**关于外键约束的相关术语:
外键约束:foreign key
外键字段:添加外键约束的字段
外键值:外键字段中的每一个值
业务背景,请设计数据库表,用来维护学生和班级的信息?

第一方案:一张表存储所有的数据
        no(pk)			name			classno			classname
        ---------------------------------------------------------------
        1					zs1				101			二中高三1班
        2					zs2				101			二中高三1班
        3					zs3				102			二中高三2班
        4					zs4				102			二中高三2班
        5					zs5				102			二中高三2班
        缺点:冗余。【不推荐】
    第二种方案:两张表(班级表和学生表)
    t_class 班级表
    cno(pk)		cname
    --------------------------------------------------------
    101		   二中高三1班
    102		   二中高三2班

    t_student 学生表
    sno(pk)		sname				classno(该字段添加外键约束fk)(添加了外键班级只能在101和102之间选择,不添加的话随便105,106都可)
    ------------------------------------------------------------
    1				zs1				101
    2				zs2				101
    3				zs3				102
    4				zs4				102
    5				zs5				102

*将以上表的建表语句写出来
t_student 中的classno字段引用t_class表中的cno字段,此时t_student叫做子表,t_class叫做父表。
顺序要求:
删除数据的时候,先删除子,表再删除父表.
添加数据的时候,先添加父表,再添加子表
创建表的时候,先创建父表,在创建子表
删除表的时候,先删除子表,再删除父表

drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);

create table t_student(
sno int,
sname varchar(255),
classno int,
primary key(sno),
foreign key (classno) references t_class (cno)
);

insert into t_class values(101,‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’);
insert into t_class values(102,‘yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy’);

insert into t_student values(1,‘zs1’,101);
insert into t_student values(2,‘zs2’,101);
insert into t_student values(3,‘zs3’,102);
insert into t_student values(4,‘zs4’,102);
insert into t_student values(5,‘zs5’,102);
insert into t_student values(6,‘zs6’,102);

select* from t_class;
select* from t_student;

在这里插入图片描述


 insert into t_student values(7,'lisi',103);
 

报错:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails t_student, CONSTRAINT t_student_ibfk_1 FOREIGN KEY (classno) REFERENCES t_class (cno))

外键值可以为null么?
外键可以为null

在这里插入图片描述

外键字段引用其他一张表的某个字段的时候,被引用的字段必须是主键么?
注意:被引用的字段不一定是主键,但至少具有unique约束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值