mysq中的约束

约束

什么是约束?

约束对应的英语单词:counstraint

在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性。

约束的作用就是为了保证:表中的数据有效性。

约束包括那些
  • 非空约束:not null
  • 唯一性约束:unique
  • 主键约束:primary key(简称PK)
  • 外键约束:foreign key(简称FK)
  • 检查约束: check(mysql不支持,oracle支持)
非空约束:not null

非空约束not null 约束的字段不能为null。

create table t_user(
id int,
name varchar(255) not null//not null只有列级约束,没有表级约束
);
唯一性约束:unique

唯一性约束unique约束的字段不能重复,但是可以为null,多个null不算重复。

create table t_user(
id int,
name varchar(255) unique
);
新需求:name和email两个字段联合起来具有唯一性!!!
create table t_user(
id int,
name varchar(255) unique,//约束直接添加在列后面,叫做列级约束
email varchar(255) unique
);

这张表这样创建是不符合我以上“新需求的”。

这样创建表示:name具有唯一性,email具有唯一性。各自唯一。

//正确创建方式
//该方式实现name重复email不重复,或者name不重复email重复
create table t_user(
id int,
name varchar(255),
email varchar(255),
unique(name,email)//约束没有添加在列的后面,这种约束称为表级约束。
);
not null 和unique联合使用
create table t_user(
id int,
name varchar(255) not null unique
);

注意:在mysql中如果一个字段同时被not null 和 unique约束的话,该字段自动变为主键字段。(在oracle中不一样)

mysql> desc t_user;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int          | YES  |     | NULL    |       |
| name  | varchar(255) | NO   | PRI | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
主键约束
什么是主键?有什么用?

主键值是每一行记录的唯一标识。

主键值是每一行记录的身份证。

主键的特征:not null + unique(主键值不能是null,同时也不能重复);

任何一张表都应该有主键,没有主键表无效!!!

一张表主键约束只能添加一个

create table t_user(
id int primary key,//列级约束
name varchar(255)
);
create table t_user(
id int ,
name varchar(255),
primary key(id)//表级约束
);
表级约束主要是给多个字段联合起来添加约束
create table t_user(
id int ,
name varchar(255),
email varchar(255),
primary key(id,name)//id和name联合起来添加约束:复合主键!!!
);

在实际开发中不建议使用:复合主键,建议使用单一主键,因为主键值存在的意义就是这行记录的身份证,只要意义达到即可,单一主键可以做到,复合主键比较复杂,不建议使用!!!

主键值建议使用:

  • int

  • bigint

  • char

    等类型

    不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的。

主键除了:单一主键和复合主键外,还可以怎样进行分类?

自然主键:主键值是一个自然数,和业务没有关系。

业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键。

在实际开发中使用业务主键多,还是使用自然主键多一些?

自然主键使用比较多,因为主键只要做到不重复就行,不需要实际意义。

业务主键不好,因为主键一旦和业务挂钩,要么当业务发生变动的时候,可能会影响到主键,所以主键不建议使用,尽量使用自然主键。

在mysql中,有一种机制,可以帮助无名自动维护一个主键值
create table t_user(
id int primary key auto_increment,//auto_increment表示自增,从1开始,以1递增
name varchar(255),
email varchar(255)
);
外键约束(foreign key ,简称PK)

业务背景:

请设计数据库表,来描述“班级和学生”的信息?

t_class是父表

t_student是子表

create table t_class(
		classno int primary key,
		classname varchar(255),
);
create table t_student(
		no int primary key auto_incroement,
		name varchar(255),
		cno int,
		foreign key(cno) references t_class(classno) //外键cno引用t_class表的classno字段
);

删除上面表的顺序?

先删除子表,再删除父表。

创建表的顺序?

先创建父表,再创建子表

删除数据的顺序?

先删除子表数据,再删除父表数据。

插入数据的顺序?

先插入父表,再插入子表。

思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?

不一定是主键,但至少具有unique约束

思考:外键可以为null吗?

外键值可以为null。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值