写点什么

表的约束

用户头像
在即
关注
发布于: 2021 年 03 月 18 日
表的约束

为现有的表添加或删除默认约束

① 删除默认约束

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'

只有当两个字段同时发生重复时,插入记录失败


发布于: 2021 年 03 月 18 日阅读数: 8
用户头像

在即

关注

还未添加个人签名 2021.02.27 加入

还未添加个人简介

评论

发布
暂无评论
表的约束