真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是 email,要求是唯一的。
在 MySQL 中,约束(Constraints)是指在创建表时规定的对表中数据进行限制的条件。它可以对表中某列或某几列添加一些限制条件,以保证表中的数据符合要求。MySQL 中的约束包括以下几种:
主键约束(Primary Key Constraint):用于标识表中每条记录的唯一性,每张表只能有一个主键,主键值不能重复且不能为空。
唯一约束(Unique Constraint):用于保证某个列的数据唯一性,每个表可以有多个唯一约束。
非空约束(Not Null Constraint):用于保证某个列的值不能为空,一个表中可以有多个非空约束。
外键约束(Foreign Key Constraint):用于关联两个表的数据,确保两个表之间的关联关系是有效的。外键约束必须在关联表的列上定义,它会限制在被关联的表中不能存在没有对应主键或唯一键值的记录。
MySQL 中的空属性指的是一个字段没有值的情况,可以使用 null 关键字来表示。null 是一个特殊的值,表示一个未知的、不存在的或不适用的值。与之相对的是空字符串(‘’),它表示一个空的字符串值,不同于 null。在 MySQL 中,可以在列定义时指定该列是否允许为空。如果列允许为空,则该列可以包含 null 值;否则,该列必须包含非 null 值。
空属性在数据库中很常见,比如一个订单表中,如果订单尚未付款,则该订单的付款时间字段可能为空。在查询时,可以使用 is null 或 is not null 运算符来判断某个字段是否为空。
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
示例:
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:
mysql> create table if not exists `myclass`(
-> class_name varchar(20) not null,
-> class_room varchar(20) not null
-> )engine=InnoDB default charset=utf8;
Query OK, 0 rows affected (0.04 sec)
mysql> desc myclass;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_name | varchar(20) | NO | | NULL | |
| class_room | varchar(20) | NO | | NULL | |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into `myclass` values('104_class', 'room301');
Query OK, 1 row affected (0.01 sec)
mysql> insert into `myclass` values('105_class', 'room302');
Query OK, 1 row affected (0.00 sec)
mysql> select * from myclass;
+------------+------------+
| class_name | class_room |
+------------+------------+
| 104_class | room301 |
| 105_class | room302 |
+------------+------------+
2 rows in set (0.00 sec)
mysql> insert into myclass values ('106_class', null);
ERROR 1048 (23000): Column 'class_room' cannot be null
mysql> insert into myclass (class_name) values ('106_class');
ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
mysql> insert into myclass (class_room) values ('302');
ERROR 1364 (HY000): Field 'class_name' doesn't have a default value