为了防止数据表中插入错误的数据,MySQL定义了一些维护数据库完整性的规则,即表的约束。常见约束分为5种,分别是默认约束、非空约束、主键约束、唯一约束和外键约束。外键约束比较复杂,涉及多表操作,将在后面的章节中讲解,本节主要讲解其余4种约束的使用方法。
1.2.1默认约束
默认约束用于为数据表中的字段指定默认值,即当在表中插入一条新记录时,如果没有给这个字段赋值,那么,数据库系统会自动为这个字段插入默认值。默认值是通过DEFAULT关键字定义的,其基本语法格式如下。
字段名 数据类型 DEFAULT默认值;
需要注意的是,BLOB、TEXT数据类型不支持默认约束。下面通过案例演示默认约束的使用及注意事项。
(1)创建my_default表,准备name和age两个字段进行测试,为age添加默认约束,设置默认值为18。
mysql> CREATE TABLE my_default (
-> name VARCHAR(10),
-> age INT UNSIGNED DEFAULT 18
-> );
(2)使用DESC查看表结构,结果如下所示。…
mysql> DESC my_default;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(10) unsigned | YES | | 18 | |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
(3)插入记录进行测试,具体SQL语句及执行结果如下。
① 在插入记录时省略name和age字段
mysql> INSERT INTO my_default VALUES();
Query OK, 1 row affected (0.00 sec)
② 在插入记录时省略age字段
mysql> INSERT INTO my_default (name) VALUES('a');
Query OK, 1 row affected (0.00 sec)
③ 在age字段中插入NULL值
mysql> INSERT INTO my_default VALUES('b', NULL);
Query OK, 1 row affected (0.00 sec)
④ 在age字段中使用默认值
mysql> INSERT INTO my_default VALUES('c', DEFAULT);
Query OK, 1 row affected (0.00 sec)
⑤ 查询结果
mysql> SELECT * FROM my_default;
+------+------+
| name | age |
+------+------+
| NULL | 18 |
| a | 18 |
| b | NULL |
| c | 18 |
+------+------+
4 rows in set (0.00 sec)
在上述示例中,由于name和age字段没有设置非空约束,在插入记录时省略了这两个字段的值,则分别使用默认值NULL和18。为age字段设置默认值18后,插入NULL值,则保存结果为NULL,不使用默认值。在为有默认值的字段指定数据时,可以通过DEFAULT关键字直接指定其使用默认值。
(4)为现有的表添加或删除默认约束,具体SQL语句及执行结果如下。
① 删除默认约束
mysql> ALTER TABLE my_default MODIFY age INT UNSIGNED;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
② 添加默认约束
mysql> ALTER TABLE my_default MODIFY age INT UNSIGNED DEFAULT 18;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
通过上述示例可以看出,使用ALTERTABLE修改列属性即可添加或删除默认约束。
1.2.2非空约束
非空约束指的是字段的值不能为NULL,在MySQL中,非空约束是通过NOTNULL定义的,其基本语法格式如下。字段名数据类型NOT NULL;
为了让读者更好地理解,下面通过案例演示非空约束的使用及注意事项。
(1)创建my_ not_ null表,准备n1、n2和n3字段进行测试,为n2和n3设置非空约束,为n3设置默认值为18。
mysql> CREATE TABLE my_not_null (
-> n1 INT,
-> n2 INT NOT NULL,
-> n3 INT NOT NULL DEFAULT 18
-> );
(2)使用DESC查看表结构,结果如下所示。
mysql> DESC my_not_null;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| n1 | int(11) | YES | | NULL | |
| n2 | int(11) | NO | | NULL | |
| n3 | int(11) | NO | | 18 | |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)
<