数据库基础-表约束

1. 什么是约束

提到约束,首先想到约束字段的是数据类型,但是数据类型约束很单一。仍然需要一些额外的约束,更好的保证数据的合法性。让它从业务逻辑角度保证数据的正确性。
比如有一个字段是身份证号,要求是唯一的,我们不能插入两个同一个身份证号。
这,就是约束!

2.约束种类

表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,
auto_increment,unique key 。

2.1 空属性

  • null(默认)和not null(不为空)
    创建一个myclass,要求班级名和班级id都不能为空:
mysql> create table myclass( class_name varchar(20) not null, class_id varchar(20) not null );

Query OK, 0 rows affected (0.06 sec)

在这里插入图片描述
如果插入数据时,没有给全数据,就会插入失败。

mysql> insert into myclass(class_name) values('class_one');

ERROR 1364 (HY000): Field 'class_id' doesn't have a default value

数据给全,插入成功!
在这里插入图片描述

2.2 默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

使用default即可将该列设为默认值。(下面再class_name后面添加了一列)

mysql> alter table myclass add sex char(2) default '女' after class_name;

Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

刚才插入过的数据,自动添加了女。
在这里插入图片描述

2.3 列描述(备注)

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

下面就是cemment使用的方法,但是desc命令看不到。

mysql> create table ttt(
    -> name varchar(20) not null comment '姓名',
    -> age int default 0 comment '年龄');


Query OK, 0 rows affected (0.03 sec)


mysql> desc ttt;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | NO   |     | NULL    |       |
| age   | int         | YES  |     | 0       |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

使用show就可以看到了:

mysql> show create table ttt;


+-------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                      |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| ttt   | CREATE TABLE `ttt` (
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `age` int DEFAULT '0' COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=gbk     |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


mysql> show create table ttt\G;


*************************** 1. row ***************************
       Table: ttt
Create Table: CREATE TABLE `ttt` (
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `age` int DEFAULT '0' COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)

ERROR: 
No query specified

在这里插入图片描述

2.4 zerofill

简单来说就是对于数字类型位数不够补0。
在这里插入图片描述
修改了列’a’的属性:
在这里插入图片描述
再次查看ttt3表:
在这里插入图片描述
这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。

2.5 主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

  • 创建表的时候直接在字段上指定主键
mysql> create table ttt1(
    -> id int primary key comment '学号',
    -> name varchar(20) not null);

Query OK, 0 rows affected (0.07 sec)

mysql> desc ttt1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

  • 主键约束:主键对应的字段中不能重复,一旦重复,操作失败。
mysql> insert into ttt1 values(1, 'bob');
Query OK, 1 row affected (0.01 sec)

mysql> insert into ttt1 values(1, 'peter');
ERROR 1062 (23000): Duplicate entry '1' for key 'ttt1.PRIMARY'


mysql> select * from ttt1;
+----+------+
| id | name |
+----+------+
|  1 | bob  |
+----+------+
1 row in set (0.00 sec)

  • 若忘记写主键,可以追加主键。(主键可以有多个列)
alter table 表名 add primary key(字段列表)
  • 删除表的主键
alter table 表名 drop primary key;
  • 复合主键
    在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。
    在这里插入图片描述

2.6 自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键.
自增长特点:
- 任何一个字段要做自增长,前提是本身是一个索引(Key一栏有值)
- 自增长字段必须是整数
- 一张表最多有一个自增长

mysql> create table tt21(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );


mysql> insert into tt21(name) values('a');
mysql> insert into tt21(name) values('b');


mysql> select * from tt21;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
+----+------+

在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)

在这里插入图片描述

2.7 唯一键(unique)

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

mysql> create table student (
-> id char(10) unique comment '学号,不能重复,但可以为空',
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.01 sec)


mysql> insert into student(id, name) values('01', 'aaa');
Query OK, 1 row affected (0.00 sec)

mysql> insert into student(id, name) values('01', 'bbb'); --唯一约束不能重复
ERROR 1062 (23000): Duplicate entry '01' for key 'id'

mysql> insert into student(id, name) values(null, 'bbb'); -- 但可以为空
Query OK, 1 row affected (0.00 sec)


mysql> select * from student;
+------+------+
| id | name |
+------+------+
| 01 | aaa |
| NULL | bbb |
+------+------+

2.8 外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

foreign key (字段名) references 主表()

先创建主表:
在这里插入图片描述
再创建从表:
在这里插入图片描述

主表插入:

insert into myclass values(10, '小班'),(20, '中班');

Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0

从表插入成功:

mysql> insert into stu values(1, 'bob', 10),(2, 'peter',20);

Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

从表插入失败:(因为主表没有30的班级)

mysql> insert into stu values(3, 'marry',30);

ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails (mytest.stu, CONSTRAINT stu_ibfk_1
FOREIGN KEY (class_id) REFERENCES myclass (id))

从表插入成功:(插入null)

mysql> insert into stu values(3, 'marry',null);

ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails (mytest.stu, CONSTRAINT stu_ibfk_1
FOREIGN KEY (class_id) REFERENCES myclass (id))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值