SQL终端指令:DDL进阶(约束)

约束:
约束对应的英语单词: constraint
在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性!
约束的作用就是为了保证:表中的数据有效!
约束包含:
①非空约束: not null
②唯一性约束: unigue
③主键约束: primary key(简称PK)
④外键约束: foreign key (简称FK)
⑤检查约束: check (mysql不支持,oracle支持)

(一)非空约束:not null

非空约束约束的字段不能NULL。
语法:建表时在字段和数据类型后面加上约束

create table 表名(
	字段名 数据类型 not null,
	...
	...);

案例:

create table room4(
			id bigint not null,
			name varchar(20) not null,
			sex char(10) not null);

创建成功能看到表的结构,各字段数据都不能为空:
在这里插入图片描述
所以插入必须完整的插入,想插入空数据便会报错,除非已经指定过默认值:
在这里插入图片描述
都是非空的条件下输入成功:
在这里插入图片描述

(二)唯一性约束:unique

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

(1)单字段独立唯一性(列级约束)

即建表时对某个字段进行约束,只会影响这一个字段。
案例:建一个人员表,id不能重复

create table room(
		id bigint unique,
		name varchar(20) not null,
		sex char(10) not null);

建好之后插入数据进行测试:

insert into room values(2206210738,'dog','男');
insert into room values(2206210738,'cat','女');

报错:重复输入相同的id
在这里插入图片描述
但是都是null的情况是都可以的:
在这里插入图片描述

(2)多字段联合唯一性(表级约束):

多字段联合唯一性即多个字段都内容都得一样才会报错。
案例:创建一个人员信息表:

create table person(
		id bigint,
		name varchar(255) unique,
		email varchar(255) unique);

但是这里张三有两个不同邮箱都要保存:

insert into person values(2206210738,'zhangsan','zhangsan@qq.com');
insert into person
values(2206210748,'zhangsan','zhangsan@123.com');

这里明显就会报错,因为各自字段后加唯一性约束,张三也不能重复。
所以真正的建表语句应该这么写:

create table person(
		id bigint unique,
		name varchar(255) ,
		email varchar(255),
		unique(id,name,email));

这里创建在进行插入:
即可成功在这里插入图片描述

(3)not null 和unique联合

两者是可以连用的,但是not null只有列级约束,没有表级约束。
案例:

create table person(
		id bigint not null unique,
		name varchar(255)  unique,
		email varchar(255) unique);

在mysql,联合使用后,非空且唯一会使该字段成为主键(PRI)字段:
在这里插入图片描述

(三)主键约束:primary key

主键约束:就是一种约束。
主键字段:该字段上添加了主键约束,这样的字段叫做主键字段。
主键值:主键字段中的每一个值都叫做:主键值。
什么是主键?有啥用?
主键值是每一行记录的唯一标识。
主键值是每一行记录的身份证号! ! !
任何一张表都应该有主键,没有主键的表是无效的。
语法案例:

create table t_room(
		t_id bigint primary key, 
		t_name varchar(20) unique,
		t_sex char(10) unique);

在这里插入图片描述
当然和前面一样,当吧primary key添加到字段后面是列级约束,把primary key添加到语句后面为表级约束。

create table t_room(
		t_id bigint primary key, 
		t_name varchar(20) unique,
		t_sex char(10) unique,
		primary key(id,name)); 

区别:表级约束主要是给多个字段联合起来添加约束,一个字段做主键是单一主键,多个字段是复合主键,和unique的作用是一样的。
两者对比:
在这里插入图片描述
结论:一张表,主键约束只能添加1个,主键只能有1个。
主键值建议使用:int、bigint、char等类型.
不建议使用: varchar来做主键。主键值一般都是数字,一般都是定长的。
主键还可以进行:
自然主键:主键值是一个自然数,和业务没关系。
业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!
业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候可能会影响到主键值,所以业务主键不建议使用。尽使用自然主键。
在mysql中有一种机制可以自动维护一个主键值:auto_increment.
案例:

create table room3(
    -> id int primary key auto_increment,
    -> name varchar(255));

在这里插入图片描述
能看到当重复插入时,mysql会按照自增的方式从1开始,以1递增,自动排号。

(四)外键约束:foreign key

外键约束:一种约束(foreign key)
外键字段:该字段上添加了外键约束.
外键值:外键字段当中的每一个值。
当一个字段没有任何约束的时候,可能会导致数据无效。可能出现一个不相关数据,为了保证数据都是正确有效的,需要给字段添加外键约束。

删除表的顺序?
	先删子表,再删父表。
创建表的顺序?
	先创建父,再创建子。
删除数据的顺序?
	先删了子,再删父.
插入数据的顺序?
	先插入父,再插入子。

案例:建立班级表和学生表,两个表通过班级号对应起来。

//班级表
 create table t_class(
     class_num int primary key, //班级号
     class_name char(10) not null, //班级名称
     class_person int); //班级人数
//学生表
create table t_tudent(
    -> t_id int primary key auto_increment, //学生学号
    -> t_name varchar(20) not null, //学生姓名
    -> t_class int, //学生所在班级号
    -> foreign key(t_class) references t_class(class_num)); //外键约束语法

当对班级号进行约束之后:

mysql> insert into t_class values(1,'高一一班',30);
Query OK, 1 row affected (0.44 sec)

mysql> insert into t_class values(2,'高一二班',30);
Query OK, 1 row affected (0.40 sec)

mysql> insert into t_class values(3,'高一三班',30);

但是向学生表中插入数据时便会报错:无法向子记录插入或更新,因为已经进行外键约束。

mysql> insert into t_tudent values(111,'爱过的吴京',1);
Query OK, 1 row affected (0.42 sec)

mysql> insert into t_tudent values(112,'爱国的吴京',6);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test_wl`.`t_tudent`, CONSTRAINT `t_tudent_ibfk_1` FOREIGN KEY (`t_class`) REFERENCES `t_class` (`class_num`))

因为班级号为6的班级在班级表中并不存在,所以学生表中也无法进行插入,即保证数据的有效性。
这里需要注意的是:
字表中的外键引用的不一定是父表中的主键,但是一定要有唯一性约束,不能重复。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值