MySQL表的约束(上)
目录
一、空属性(NULL/NOT NULL)
二、默认值(DEFAULT)
三、列描述(COMMENT)
四、Zerofill
五、主键(PRIMARY KEY)
总结
一、空属性(NULL/NOT NULL)
默认情况下,字段允许为 NULL
。但实际开发中应尽量使用 NOT NULL
,避免数据参与运算时产生问题(如 NULL + 1 = NULL
)。
若字段不允许为空,插入数据时必须提供值,否则会触发错误。
以下以 “员工信息表” 为例进行说明:
🌴创建 “员工信息表”
在这里,name
(员工姓名)和 department
(部门)字段设置了 NOT NULL
属性,即它们不允许为空。这意味着在向员工信息表插入新员工记录时,必须提供员工姓名和部门的信息,否则插入操作将失败。
🌴查看表结构
可以看到,name 和 department
字段的 Null
列显示为 NO
,表示它们不允许为空。
🌴插入记录
假设要插入一条新员工记录,例如,员工 ID 为 1,姓名为 “张三”,部门为 “销售部”,职位为 “销售经理”。可以使用以下 SQL 语句:
这条语句能够插入成功,因为 name和 department字段都提供了非空值。
但如果尝试插入一条记录,例如,员工 ID 为 2,姓名为空,部门为 “技术部”,职位为 “软件工程师”:
这条语句将会失败,因为 name
字段被设置为 NOT NULL
,而插入的值为空。
同样地,如果尝试插入一条记录,员工 ID 为 3,姓名为 “李四”,部门为空,职位为 “产品经理”:
这条语句也会失败,因为 depart字段被设置为 NOT NULL
,而插入的值为空。
综上所述,在创建表时给字段设置 NOT NULL
属性,可以确保在插入数据时这些字段必须提供非空值,从而保证数据的完整性和一致性。
二、默认值(DEFAULT)
- 当字段经常出现特定值时,可设置默认值,插入数据时可省略该字段。
- 默认值可以是常量、表达式或函数(如
CURRENT_TIMESTAMP
)。
以下以 “图书表” 为例进行说明:
🌵创建 “图书表”
在这里,status
(图书状态)字段默认值为 “未借阅”,borrower
(借阅者)字段默认值为空字符串。这意味着在向图书表插入新图书记录时,如果不指明图书状态或借阅者,会自动使用默认值进行填充。
🌵查看表结构
可以看到,status
字段的 Default
列显示为 “未借阅”,borrower
字段的 Default
列显示为空字符串。
🌵插入记录
假设要插入一条新图书记录,例如,图书 ID 为 1,书名为 “数据结构与算法”,作者为 “张三”,可以使用以下 SQL 语句:
这条语句能够插入成功,因为 status
和 borrower
字段没有被指定值,会自动使用默认值 “未借阅” 和空字符串。
如果尝试插入一条记录,指明图书 ID 为 2,书名为 “计算机网络”,作者为 “李四”,状态为 “已借阅”,借阅者为 “王五”:
这条语句也会成功,因为指定了所有字段的值。
🌵同时设置NOT NULL
和DEFAULT
以创建一个 “学生表” 为例,表中包含学生姓名、学号和成绩,成绩默认为 0,且学生姓名和学号字段不允许为空。SQL 定义如下:
在这个表中,name、id字段设置了 NOT NULL
属性,score
字段设置了默认值 0。创建表后查看表结构,会发现 name、id
字段不允许为空,score
字段的默认值为 0。
向表中插入数据时,如果不指明成绩,会自动使用默认值 0:
插入成功后,score
字段的值为 0。
🌵注意事项
- 谨慎使用默认值:默认值应该设置为合理的值,以确保数据的准确性和一致性。
NOT NULL
和DEFAULT
的关系:设置了DEFAULT
属性的字段,通常不需要再设置NOT NULL
,因为即使没有插入值,也会使用默认值填充,从而避免了空值的出现。- 检查表结构:在创建表后,可以使用
DESC
或类似语句检查表结构,以确保默认值和NOT NULL
约束已正确设置。
三、列描述(COMMENT)
- 为字段添加注释,提高代码可读性,便于团队协作。
- 注释信息通过
SHOW CREATE TABLE
查看,DESC
命令不显示。
以下以 “订单表” 为例进行说明:
🌻创建 “订单表”
在这里,每个字段后面都添加了 COMMENT
关键字,用于描述该字段的含义。例如:
- id字段的描述是 “订单编号”。
- orderdate字段的描述是 “订单日期”。
- name字段的描述是 “客户名称”。
🌻查看表的创建细节
可以看到,每个字段的描述信息(COMMENT
)都包含在表的创建语句中。
🌻说明
列描述在创建表时添加,主要目的是帮助程序员或数据库管理员(DBA)更好地理解表结构和字段的含义。这对于维护和扩展数据库非常有帮助,尤其是在团队协作开发中,可以确保所有成员对表结构有一致的理解。
四、Zerofill
- 用于数值类型的显示格式,左侧补零至指定长度。
- 注意:不影响实际存储的值,仅为显示效果。
以下以 “书籍表” 为例进行说明:
🍇创建 “书籍表”
在这里,id字段的显示宽度设置为 5,但没有设置 ZEROFILL
属性。
🍇插入数据并查看
向表中插入一条记录,指明 id和 name的值分别为 1 和 “数据结构与算法”,Price
为 59.99,然后查看表中的数据:
可以看到,id字段显示为 1,并没有按照显示宽度 5 来显示。
🍇修改表结构并添加 ZEROFILL
属性
修改 id字段,添加 ZEROFILL
属性:
再次向表中插入一条记录,指明 id和 name的值分别为 2 和 “计算机网络”,Price
为 45.50:
查看表中的数据:
可以看到,id
字段显示为 00001 和 00002,因为 ZEROFILL
属性会自动在数值前面填充零,使其显示宽度达到 5 位。
🍇验证底层存储
虽然 ZEROFILL
改变了数据的显示方式,但底层存储的数据仍然是原来的值。可以使用 HEX
函数查看底层存储的值:
可以看到,底层存储的值仍然是 1 和 2,ZEROFILL
只是改变了数据的显示方式。
五、主键(PRIMARY KEY)
- 主键字段的值唯一且非空,一张表只能有一个主键。
- 通常使用整数类型(如
INT
)作为主键。
以下分别以 "员工表" 和 "库存表" 为例,对主键和复合主键进行说明。
主键案例:员工表
🍀创建员工表
🍀查看表结构
可以看到,id字段的 Key
列显示为 PRI
,表示该字段是主键。
🍀插入记录
尝试插入两条记录:
第二条插入语句将会失败,因为 id为 1 的记录已经存在,主键冲突。
🍀删除主键
再次查看表结构,id字段的 Key
列的 PRI
标志将消失。
🍀添加主键
再次查看表结构,id字段的 Key
列的 PRI
标志将重新出现。
复合主键案例:库存表
🍀创建库存表
🍀查看表结构
可以看到,ProductID
和 WarehouseID
字段的 Key
列都显示为 PRI
,表示它们共同组成了复合主键。
🍀插入记录
尝试插入两条记录:
第二条插入语句将会失败,因为 ProductID
为 101 且 WarehouseID
为 1 的记录已经存在,复合主键冲突。
允许插入以下记录,因为虽然 ProductID
或 WarehouseID
可能重复,但它们的组合不重复:
🍀查看插入的数据
可以看到,表中有重复的 ProductID
和重复的 WarehouseID
,但没有重复的 ProductID
和 WarehouseID
组合。
🍀删除复合主键
再次查看表结构,ProductID
和 WarehouseID
字段的 Key
列的 PRI
标志将消失。
🍀添加复合主键
再次查看表结构,ProductID
和 WarehouseID
字段的 Key
列的 PRI
标志将重新出现。
总结
约束类型 | 作用 | 注意事项 |
---|---|---|
NOT NULL | 字段值不能为空 | 避免数据运算异常 |
DEFAULT | 字段默认值 | 仅对允许为空的字段有效 |
COMMENT | 列描述信息 | 通过 SHOW CREATE TABLE 查看 |
ZEROFILL | 数值显示补零 | 不影响实际存储值 |
PRIMARY KEY | 唯一标识记录,确保数据唯一性 | 每表只能有一个,可为复合主键 |