表的约束
为现有的表添加或删除默认约束
① 删除默认约束
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
非空约束:字段的值不能为 NULL。
字段名 数据类型 NOT NULL;
非空约束使用示例
mysql> CREATE TABLE mynotnull (
-> n1 INT,
-> n2 INT NOT NULL,
-> n3 INT NOT NULL DEFAULT 18
-> );
查看表结构
mysql> DESC mynotnull;
+-------+---------+------+-----+---------+-------+
| 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)
插入记录进行测试
① 省略 n2 字段,插入失败,提示 n2 没有默认值
mysql> INSERT INTO mynotnull VALUES();
ERROR 1364 (HY000): Field 'n2' doesn't have a default value
② 将 n2 字段设为 NULL,插入失败,提示 n2 字段不能为 NULL
mysql> INSERT INTO mynotnull VALUES(NULL, NULL, NULL);
ERROR 1048 (23000): Column 'n2' cannot be null
③ 将 n3 字段设为 NULL,插入失败,提示 n3 字段不能为 NULL
mysql> INSERT INTO mynotnull VALUES(NULL, 20, NULL);
ERROR 1048 (23000): Column 'n3' cannot be null
④ 省略 n1 和 n3 字段,插入成功
mysql> INSERT INTO mynotnull (n2) VALUES(20);
Query OK, 1 row affected (0.00 sec)
插入记录进行测试
⑤ 查询结果
mysql> SELECT * FROM mynotnull;
+------+----+----+
| n1 | n2 | n3 |
+------+----+----+
| NULL | 20 | 18 |
+------+----+----+
1 row in set (0.00 sec)
唯一约束:保证数据表中字段的唯一性,
即表中字段的值不能重复出现。
列级约束
字段名 数据类型 UNIQUE;
表级约束
UNIQUE(字段名 1, 字段名 2, …);
列级约束:定义在一个列上,只对该列起约束作用;
表级约束:独立于列的定义,可以应用在一个表的多个列上。
唯一约束使用示例
列级约束
mysql> CREATE TABLE myunique1 (
-> id INT UNSIGNED UNIQUE,
-> username VARCHAR(10) UNIQUE
-> );
Query OK, 0 rows affected (0.01 sec)
表级约束
mysql> CREATE TABLE myunique2 (
-> id INT UNSIGNED,
-> username VARCHAR(10),
-> UNIQUE(id),
-> UNIQUE(username)
-> );
Query OK, 0 rows affected (0.01 sec)
查看表结构
+----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| id | int(10) unsigned | YES | UNI | NULL | |
| username | varchar(10) | YES | UNI | NULL | |
+----------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
为含唯一约束的字段插入记录
① 插入不重复记录,插入成功
mysql> INSERT INTO myunique1 (id) VALUES(1);
Query OK, 1 rows affected (0.01 sec)
mysql> INSERT INTO myunique1 (id) VALUES(2);
Query OK, 1 rows affected (0.01 sec)
② 插入重复记录,插入失败
mysql> INSERT INTO myunique1 (id) VALUES(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'id'
③ 查询插入的结果
mysql> SELECT * FROM myunique1;
+------+----------+
| id | username |
+------+----------+
| 1 | NULL |
| 2 | NULL |
+------+----------+
2 rows in set (0.00 sec)
唯一约束允许存在多个 NULL 值
为现有表添加唯一约束
① 创建测试表
mysql> CREATE TABLE myunique3 (id INT);
Query OK, 0 rows affected (0.01 sec)
② 添加唯一约束
mysql> ALTER TABLE myunique3 ADD UNIQUE(id);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
唯一约束的完整语法:“UNIQUE KEY id
(id
)”
(它是“UNIQUE(id)”的完整形式)
UNIQUE KEY 索引名 (字段列表)
在添加唯一约束时需要创建索引,加快查询速度。
索引名可以自己指定,也可以省略。
省略时,MySQL 自动使用字段名作为索引名。
删除唯一约束
④ 删除唯一约束
mysql> ALTER TABLE myunique3 DROP INDEX id;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
⑤ 查看删除结果
mysql> SHOW CREATE TABLE myunique3\G
************************* 1. row *************************
Table: myunique3
Create Table: CREATE TABLE my_unique_3
(
id
int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
复合唯一约束使用示例
① 创建测试表,添加复合唯一键
mysql> CREATE TABLE myunique4 (
-> id INT UNSIGNED, username VARCHAR(10),
-> UNIQUE(id, username)
-> );
Query OK, 0 rows affected (0.01 sec)
② 插入不重复记录,插入成功
mysql> INSERT INTO myunique4 VALUES(1, '2');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO myunique4 VALUES(1, '3');
Query OK, 1 row affected (0.00 sec)
③ 插入重复记录,插入失败
mysql> INSERT INTO myunique4 VALUES(1, '2');
ERROR 1062 (23000): Duplicate entry '1-2' for key 'id'
只有当两个字段同时发生重复时,插入记录失败
。
版权声明: 本文为 InfoQ 作者【在即】的原创文章。
原文链接:【http://xie.infoq.cn/article/7b59182a98f8f20395dd6f125】。文章转载请联系作者。
评论