数据库约束(2)
1.检查约束
检查约束时用来检查数据表中字段值有效性的一种手段,可以通过create table或者alter table语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。
CHECK 表达式
在更新表数据的时候,系统会检查更新后的数据行是否满足 CHECK 约束中的限定条件。MySQL 可以使用简单的表达式来实现 CHECK 约束,也允许使用复杂的表达式作为限定条件,例如在限定条件中加入子查询。
注意:若将 CHECK 约束子句置于所有列的定义以及主键约束和外键定义之后,则这种约束也称为基于表的 CHECK 约束。该约束可以同时对表中多个列设置限定条件。
在创建表时设置检查约束
案例:
创建tb_emp6数据表,要求salary字段值大于0且小于10000
mysql> CREATE TABLE tb_emp6(
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> CHECK(salary>0 AND salary<100),
-> FOREIGN KEY(deptId) REFERENCES tb_dept1(id));
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> desc tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptId | int | YES | MUL | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
在修改表时添加检查约束
ALTER TABLE tb_emp7 ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
案例:
修改tb_emp6数据表,要求id字段值大于0
mysql> ALTER TABLE tb_emp6 ADD CONSTRAINT check_id CHECK(id>0);
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptId | int | YES | MUL | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
删除检查约束
ALTER TABLE 数据表名 DROP CONSTRAINT 检查约束名;
案例:
删除tb_emp6表中的check_id检查约束
mysql> ALTER TABLE tb_emp6 DROP CONSTRAINT check_id;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptId | int | YES | MUL | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
2.默认约束
默认值的完整名称时默认值约束,用来指定某列的默认值。在表中插入一条新纪录时,如果没有为某个字段赋值,系统就会自动为这个志短插入默认值。
例如,在员工信息表中,部门位置在北京的较多,那么部门位置就可以默认为北京,系统就会自动为这个字段赋值为北京。
默认值约束通常用在已经设置了非空约束的列,这样能够放孩子数据表再录入数据时出现错误。
在创建表时设置默认值约束
字段名 数据类型 default 默认值;
案例:
mysql> create table tb_dept3(id int(11) primary key ,name varchar(22),location varchar(50) default 'beijing');
Query OK, 0 rows affected, 1 warning (0.05 sec)mysql> desc tb_dept3;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(22) | YES | | NULL | |
| location | varchar(50) | YES | | beijing | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
以上语句执行成功之后,表 tb_dept3 上的字段 location 拥有了一个默认值 Beijing,新插入的记录如果
没有指定部门位置,则默认都为 Beijing。
⚠️:在创建表时为列添加默认值,可以一次为多个列添加默认值,需要注意不同列的数据类型。
在修改表时添加默认值约束
ALTER TABLE 数据表名
CHANGE COLUMN 字段名 数据类型 default 默认值;
案例:
修改数据表tb_dept3,将部门位置的默认值修改为shanghai
mysql> alter table tb_dept3 change column location location varchar(50) default 'shanghai';
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tb_dept3;
+----------+-------------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+----------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(22) | YES | | NULL | |
| location | varchar(50) | YES | | shanghai | |
+----------+-------------+------+-----+----------+-------+
3 rows in set (0.00 sec)
删除默认约束
ALTER TABLE 数据表名
CHANGE COLUMN 字段名 字段名 数据类型 DEFAULT NULL;
案例:
修改数据表tb_dept3,将部门位置的默认值约束删除
mysql> alter table tb_dept3 change column location location varchar(50) default null;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tb_dept3;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(22) | YES | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
3.非空约束
非空约束是指字段值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。可以通过create table或者alter table语句实现。在表中某个列的定义后加上关键字not null作为限定词,来约束该列的取值不能为空。
比如,在用户信息表中,如果不添加用户名,那么这条用户信息就是无效的,这是就可以为用户名字段设置非空约束。
在创建表时设置非空约束
字段名 数据类型 not null;
案例:
创建数据表tb_dept4,部门名称不能为空
mysql> create table tb_dept4(id int(11) primary key ,name varchar(22) not null,location varchar(50));
Query OK, 0 rows affected, 1 warning (0.06 sec)mysql> desc tb_dept4;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
在修改表时添加非空约束
ALTER TABLE 数据表名
CHANGE COLUMN 字段名 字段名 数据类型 not null
案例:
修改数据表tb_dept4,指定部门位置不能为空
mysql> alter table tb_dept4 change column location location varchar(50) not null;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tb_dept4;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
删除非空约束
ALTER TABLE 数据表名
CHANGE COLUMN 字段名 字段名 数据类型 null;
案例:
修改数据表tb_dept4,将部门位置的非空约束删除
mysql> alter table tb_dept4 change column location location varchar(50) null;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tb_dept4;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)