8.1 约束简介

  1. 含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性
  2. 分类:
  3. not null:非空,用于保证该字段的值不能为空。比如姓名、学号
  4. default:默认,用于保证该字段有默认值
  5. primary key:主键,用于保证该字段的值具有唯一性,并且非空
  6. unique:唯一,用于保证该字段的值具有唯一性,可以为空
  7. foreign key:外键,限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
  8. 添加约束的时机:
  9. 1.创建表时
  10. 2.修改表时
  11. 约束的分类:
  12. 列级约束:六大约束都支持,但外键约束没有效果
  13. 表级约束:除了非空、默认、其他都支持
  14. create table 表名(
  15. 字段名 字段类型 列级约束,
  16. 字段名 字段约束,
  17. 表级约束
  18. )

8.2 案例

列级约束

  1. mysql> create table major(id int primary key,majorname varchar(20));
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> create table stuinfo(
  4. id int primary key,
  5. stuname varchar(20) not null,
  6. gender char(1) check (gender ='男'or gender='女'),
  7. seat int unique,
  8. age int default 18,
  9. majorId int references major(id));
  10. Query OK, 0 rows affected (0.00 sec)
  11. mysql> desc stuinfo;
  12. +---------+-------------+------+-----+---------+-------+
  13. | Field | Type | Null | Key | Default | Extra |
  14. +---------+-------------+------+-----+---------+-------+
  15. | id | int(11) | NO | PRI | NULL | |
  16. | stuname | varchar(20) | NO | | NULL | |
  17. | gender | char(1) | YES | | NULL | |
  18. | seat | int(11) | YES | UNI | NULL | |
  19. | age | int(11) | YES | | 18 | |
  20. | majorId | int(11) | YES | | NULL | |
  21. +---------+-------------+------+-----+---------+-------+
  22. 6 rows in set (0.06 sec)
  23. mysql> mysql> show index from stuinfo;
  24. +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+-----+
  25. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Nut |
  26. +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+-----+
  27. | stuinfo | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | |
  28. | stuinfo | 0 | seat | 1 | seat | A | 0 | NULL | NULL | YE |
  29. +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+-----+
  30. 2 rows in set (0.00 sec)

表级约束

  1. mysql> create table stuinfo(
  2. id int,
  3. stuname varchar(20),
  4. gender char(1),
  5. seat int,
  6. age int,
  7. majorId int,
  8. primary key(id),
  9. unique(seat)
  10. );

主键和唯一的大比对
唯一性 是否允许为空 一个表中 是否允许组合
主键 √ × 至多有1个 可以,不推荐
唯一 √ √ 可以有多个 可以,不推荐

修改表时添加约束

  1. mysql> create table stuinfo(id int,stuname varchar(20),seat int,age int,majorid int);
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> desc stuinfo;
  4. +---------+-------------+------+-----+---------+-------+
  5. | Field | Type | Null | Key | Default | Extra |
  6. +---------+-------------+------+-----+---------+-------+
  7. | id | int(11) | YES | | NULL | |
  8. | stuname | varchar(20) | YES | | NULL | |
  9. | seat | int(11) | YES | | NULL | |
  10. | age | int(11) | YES | | NULL | |
  11. | majorid | int(11) | YES | | NULL | |
  12. +---------+-------------+------+-----+---------+-------+
  13. 5 rows in set (0.00 sec)
  14. mysql> alter table stuinfo modify column stuname varchar(20) not null;
  15. Query OK, 0 rows affected (0.00 sec)
  16. Records: 0 Duplicates: 0 Warnings: 0
  17. mysql> desc stuinfo;
  18. +---------+-------------+------+-----+---------+-------+
  19. | Field | Type | Null | Key | Default | Extra |
  20. +---------+-------------+------+-----+---------+-------+
  21. | id | int(11) | YES | | NULL | |
  22. | stuname | varchar(20) | NO | | NULL | |
  23. | seat | int(11) | YES | | NULL | |
  24. | age | int(11) | YES | | NULL | |
  25. | majorid | int(11) | YES | | NULL | |
  26. +---------+-------------+------+-----+---------+-------+
  27. 5 rows in set (0.00 sec)
  28. mysql> alter table stuinfo modify column age int default 18;
  29. Query OK, 0 rows affected (0.00 sec)
  30. Records: 0 Duplicates: 0 Warnings: 0
  31. mysql> desc stuinfo;
  32. +---------+-------------+------+-----+---------+-------+
  33. | Field | Type | Null | Key | Default | Extra |
  34. +---------+-------------+------+-----+---------+-------+
  35. | id | int(11) | YES | | NULL | |
  36. | stuname | varchar(20) | NO | | NULL | |
  37. | seat | int(11) | YES | | NULL | |
  38. | age | int(11) | YES | | 18 | |
  39. | majorid | int(11) | YES | | NULL | |
  40. +---------+-------------+------+-----+---------+-------+
  41. 5 rows in set (0.00 sec)
  42. mysql>
  43. mysql> alter table stuinfo modify column id int primary key;
  44. Query OK, 0 rows affected (0.00 sec)
  45. Records: 0 Duplicates: 0 Warnings: 0
  46. mysql> desc stuinfo;
  47. +---------+-------------+------+-----+---------+-------+
  48. | Field | Type | Null | Key | Default | Extra |
  49. +---------+-------------+------+-----+---------+-------+
  50. | id | int(11) | NO | PRI | NULL | |
  51. | stuname | varchar(20) | NO | | NULL | |
  52. | seat | int(11) | YES | | NULL | |
  53. | age | int(11) | YES | | 18 | |
  54. | majorid | int(11) | YES | | NULL | |
  55. +---------+-------------+------+-----+---------+-------+
  56. 5 rows in set (0.00 sec)

8.3 标识列

标识列又称为自增长列,含义:可以不用手动的插入值,系统提供默认的序列值