MySQL约束总结(CONSTRAINT)

约束的含义

一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。MySQL数据库通过约束(constraints)防止无效的数据进入到表中,以保护数据的实体完整性。

约束的分类

MySQL 中,主要有六种约束:

1、NOT NULL:非空约束,用于约束该字段的值不能为空。比如姓名、学号等。
2、DEFAULT:默认值约束,用于约束该字段有默认值,约束当数据表中某个字段不输入值时,自动为其添加一个已经设置好的值。比如性别。
3、PRIMARY KEY:主键约束,用于约束该字段的值具有唯一性,至多有一个,可以没有,并且非空。比如学号、员工编号等。
4、UNIQUE:唯一约束,用于约束该字段的值具有唯一性,可以有多个,可以没有,可以为空。比如座位号。
5、CHECK:检查约束,用来检查数据表中,字段值是否有效。比如年龄、性别。
6、FOREIGN KEY:外键约束,外键约束经常和主键约束一起使用,用来确保数据的一致性,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中某列的值。比如学生表的专业编号,员工表的部门编号,员工表的工种编号。

主要归类为列级约束和表级约束

  1. 列级约束NOT NULL | DEFAULT | PRIMARY KEY | UNIQUE | CHECK
  2. 表级约束PRIMARY KEY | UNIQUE | CHECK | FOREIGN KEY

实例

列约束:在字段名和类型后面追加约束类型即可

表约束:在各个列字段的最下面,CONSTRAINT 开头进行约束

CREATE TABLE 表名(
    字段名 字段类型 列级约束,
    字段名 字段类型,
    表级约束
  )

创建表时添加约束

-- 列约束
mysql> CREATE TABLE teachers(
    -> id INT PRIMARY KEY, 
    -> stuName VARCHAR(20) NOT NULL UNIQUE,
    -> gender CHAR(1) CHECK(gender='W' OR gender='M'),
    -> seat INT UNIQUE,
    -> age INT DEFAULT 18
    -> );
Query OK, 0 rows affected (0.04 sec)

-- 列约束和表约束
mysql> CREATE TABLE students (
    -> id INT PRIMARY KEY AUTO_INCREMENT,
    -> name VARCHAR(20) NOT NULL,
    -> age INT NOT NULL DEFAULT 18,
    -> gender CHAR CHECK(gender IN ('W','M')),
    -> tid INT,
    -> CONSTRAINT fk FOREIGN KEY(tid) REFERENCES teachers(id)
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> show index from teachers;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| teachers |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| teachers |          0 | stuName  |            1 | stuName     | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| teachers |          0 | seat     |            1 | seat        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

mysql> show index from students;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| students |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| students |          1 | fk       |            1 | tid         | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

修改表时添加约束

mysql> CREATE TABLE info (
    -> id INT,
    -> name VARCHAR(20),
    -> age INT,
    -> gender CHAR,
    -> tid INT
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> ALTER TABLE info MODIFY COLUMN id INT PRIMARY KEY;              # 添加列主键约束
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info MODIFY COLUMN name VARCHAR(20) NOT NULL;       # 添加列非空约束
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info MODIFY COLUMN age INT DEFAULT 18;              # 添加列默认约束
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info MODIFY COLUMN tid INT UNIQUE;                  # 添加列唯一约束
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc info;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(20) | NO   |     | NULL    |       |
| age    | int(11)     | YES  |     | 18      |       |
| gender | char(1)     | YES  |     | NULL    |       |
| tid    | int(11)     | YES  | UNI | NULL    |       |
+--------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> alter table info drop primary key;                             # 删除列主键约束
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info ADD PRIMARY KEY(id);                          # 添加“表”主键约束        
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info ADD UNIQUE(tid);                              # 添加“表”唯一约束 
Query OK, 0 rows affected, 1 warning (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> ALTER TABLE info ADD CONSTRAINT ue UNIQUE(tid);                # 添加“表”唯一约束
Query OK, 0 rows affected, 1 warning (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> desc info;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(20) | NO   |     | NULL    |       |
| age    | int(11)     | YES  |     | 18      |       |
| gender | char(1)     | YES  |     | NULL    |       |
| tid    | int(11)     | YES  | UNI | NULL    |       |
+--------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

mysql> ALTER TABLE info ADD CONSTRAINT ck CHECK(gender IN ('W','M')); # 添加“表”检查约束 
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info ADD CONSTRAINT fy FOREIGN KEY(tid) REFERENCES teachers(id);    # 添加“表”外键约束
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

修改表时删除约束

mysql> ALTER TABLE info MODIFY COLUMN name varchar(20) NULL;    # 删除列非空约束
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info MODIFY COLUMN age INT(11);              # 删除列默认约束
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info DROP PRIMARY KEY;                       # 删除“表”主键约束
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info DROP INDEX tid;                         # 删除“表”唯一约束
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table info \G
*************************** 1. row ***************************
       Table: info
Create Table: CREATE TABLE `info` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` char(1) DEFAULT NULL,
  `tid` int(11) DEFAULT NULL,
  UNIQUE KEY `tid_2` (`tid`),
  UNIQUE KEY `ue` (`tid`),
  CONSTRAINT `fy` FOREIGN KEY (`tid`) REFERENCES `teachers` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)

mysql> ALTER TABLE info DROP INDEX ue;                          # 删除“表”唯一约束
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE info DROP FOREIGN KEY fy;                    # 删除“表”外键约束
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table info \G
*************************** 1. row ***************************
       Table: info
Create Table: CREATE TABLE `info` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` char(1) DEFAULT NULL,
  `tid` int(11) DEFAULT NULL,
  UNIQUE KEY `tid_2` (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)

mysql> desc info;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   |     | NULL    |       |
| name   | varchar(20) | YES  |     | NULL    |       |
| age    | int(11)     | YES  |     | NULL    |       |
| gender | char(1)     | YES  |     | NULL    |       |
| tid    | int(11)     | YES  | UNI | NULL    |       |
+--------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

主键和唯一的区别

约束名称保证唯一性是否允许为空一个表中可以有多少个是否允许组合
主键×最多有1个,可以没有√(不推荐)
唯一可以有多个√(不推荐)
  • 12
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:在MySQL,可以使用约束来确保表的数据满足特定的条件。其,唯一性约束是一种常见的约束类型。唯一性约束可以保证某个列的值在表是唯一的。在创建表时,可以使用列级约束或表级约束来实现唯一性约束。列级约束是在列定义时指定的,而表级约束是在表定义的末尾指定的。例如,可以使用UNIQUE关键字来创建唯一性约束。引用\[2\]:另外,还可以使用联合约束来实现多个列的唯一性约束。联合约束表示多个字段的组合必须在表是唯一的。在创建表时,可以使用UNIQUE关键字并指定多个字段来创建联合约束。引用\[3\]:此外,约束还可以命名,以便以后可以通过名称来引用和删除约束。在创建约束时,可以使用CONSTRAINT关键字并指定约束的名称。例如,可以使用UNIQUE关键字和CONSTRAINT关键字来创建具有名称的唯一性约束。在MySQL,还可以使用NOT NULL约束来确保某个列的值不为空。在创建表时,可以在列定义时指定NOT NULL关键字来创建非空约束。如果插入数据时未提供非空列的值,则会引发错误。 #### 引用[.reference_title] - *1* *2* *3* [MySQL——约束(constraint)详解](https://blog.csdn.net/w_linux/article/details/79655073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值