数据库约束(2)

数据库约束(2)

1.检查约束

检查约束时用来检查数据表中字段值有效性的一种手段,可以通过create table或者alter table语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。

sql 复制代码
CHECK 表达式

在更新表数据的时候,系统会检查更新后的数据行是否满足 CHECK 约束中的限定条件。MySQL 可以使用简单的表达式来实现 CHECK 约束,也允许使用复杂的表达式作为限定条件,例如在限定条件中加入子查询。

注意:若将 CHECK 约束子句置于所有列的定义以及主键约束和外键定义之后,则这种约束也称为基于表的 CHECK 约束。该约束可以同时对表中多个列设置限定条件。

在创建表时设置检查约束

案例:

创建tb_emp6数据表,要求salary字段值大于0且小于10000

sql 复制代码
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)

在修改表时添加检查约束

sql 复制代码
ALTER TABLE tb_emp7 ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
案例:

修改tb_emp6数据表,要求id字段值大于0

sql 复制代码
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)

删除检查约束

sql 复制代码
ALTER TABLE 数据表名 DROP CONSTRAINT 检查约束名;
案例:

删除tb_emp6表中的check_id检查约束

sql 复制代码
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.默认约束

默认值的完整名称时默认值约束,用来指定某列的默认值。在表中插入一条新纪录时,如果没有为某个字段赋值,系统就会自动为这个志短插入默认值。

例如,在员工信息表中,部门位置在北京的较多,那么部门位置就可以默认为北京,系统就会自动为这个字段赋值为北京。

默认值约束通常用在已经设置了非空约束的列,这样能够放孩子数据表再录入数据时出现错误。

在创建表时设置默认值约束

sql 复制代码
字段名 数据类型 default 默认值;
案例:
sql 复制代码
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。

⚠️:在创建表时为列添加默认值,可以一次为多个列添加默认值,需要注意不同列的数据类型。

在修改表时添加默认值约束

sql 复制代码
ALTER TABLE 数据表名
CHANGE COLUMN 字段名 数据类型 default 默认值;
案例:

修改数据表tb_dept3,将部门位置的默认值修改为shanghai

sql 复制代码
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: 0

mysql> 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)

删除默认约束

sql 复制代码
ALTER TABLE 数据表名
CHANGE COLUMN 字段名 字段名 数据类型 DEFAULT NULL;
案例:

修改数据表tb_dept3,将部门位置的默认值约束删除

sql 复制代码
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: 0

mysql> 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作为限定词,来约束该列的取值不能为空。

比如,在用户信息表中,如果不添加用户名,那么这条用户信息就是无效的,这是就可以为用户名字段设置非空约束。

在创建表时设置非空约束

sql 复制代码
字段名 数据类型 not null;
案例:

创建数据表tb_dept4,部门名称不能为空

sql 复制代码
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)

在修改表时添加非空约束

sql 复制代码
ALTER TABLE 数据表名
CHANGE COLUMN 字段名 字段名 数据类型 not null
案例:

修改数据表tb_dept4,指定部门位置不能为空

sql 复制代码
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: 0

mysql> 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)

删除非空约束

sql 复制代码
ALTER TABLE 数据表名
CHANGE COLUMN 字段名 字段名 数据类型 null;
案例:

修改数据表tb_dept4,将部门位置的非空约束删除

sql 复制代码
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: 0

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)
相关推荐
圆️️18 分钟前
【故障处理】ORA-19849 ORA-19612 0RA-17627 ORA-03114
运维·数据库·oracle
m0_7482489426 分钟前
在线影视播放网站PHP电影网站源码自动采集MKCMS升级版米酷模板含WAP手机版附三套模板
android·开发语言·php
圆️️36 分钟前
12c及以后 ADG主备切换
服务器·网络·数据库
圆️️38 分钟前
11g ADG主备切换步骤
数据库·sql
一个高效工作的家伙1 小时前
安装mariadb+galera搭建数据库集群
运维·服务器·数据库
PGCCC1 小时前
【PGCCC】commit_delay 对性能的提升:PostgreSQL 基准测试
数据库·postgresql
Mekeater3 小时前
手写一个C++ Android Binder服务及源码分析
android·c++·binder·remote·iservicemanager·bpbinder·bprefbase
漫步者TZ4 小时前
【kafka系列】Topic 与 Partition
数据库·分布式·kafka
Austindatabases5 小时前
PostgreSQL SQL优化用兵法,优化后提高 140倍速度
数据库·sql·postgresql
Mr.L-OAM5 小时前
SQL自学,mysql从入门到精通 --- 第 15天,数据导入、导出
android·sql·mysql