数据完整性是指数据的准确性和逻辑一致性,用来防止数据库中存在不符合语义、无效数据或错误数据等。例如,网上商城系统数据库中的商品编号、名称不能为空,订单号必须唯一,邮箱格式必须符合规范等。MySQL中,数据完整性通常使用约束来实现,本任务主要的约束包括PRIMARY KEY约束、NOT NULL约束、DEFAULT约束、UNIQUE约束、CHECK约束和FOREIGH KEY约束。
又称为主键约束,定义表中构成主键的一列或多列。 主键用于唯一标识表中的每条记录,作为主键的字段值不能为NULL且必须唯一,可以是单一字段,也可以是多个字段的组合。 每个数据表中最多只能有一个主键约束。
在Navicat中创建商品表goods。
序号 | 字段 | 数据类型 | 主键 | 允许空 | 说明 |
---|---|---|---|---|---|
1 | gid | int | 是 | 否 | 商品id |
2 | gname | varchar(200) | 否 | 商品名称 | |
3 | gprice | decimal(20,2) | 否 | 价格 |
使用PRIMARY KEY关键字设置主键约束
主键约束由关键字PRIMARY KEY标识。
字段名 数据类型 PRIMARY KEY
使用SQL语句,创建商品表goods,并设置gid列为主键。
mysql> CREATE TABLE goods
-> (gid int PRIMARY KEY, #标识该字段为主键
-> gname varchar(30) NOT NULL,
-> gprice decimal(20,2)
-> );
Query OK, 0 rows affected (0.03 sec)
当主键由多个字段组合构成时,主键只能在字段定义完成后设置。
PRIMARY KEY(字段名1,字段名2,…,字段名n)
【例3.36】创建购物车表car。
序号 | 字段 | 数据类型 | 主键 | 允许空 | 说明 |
---|---|---|---|---|---|
1 | gid | int | 是 | 否 | 商品id |
2 | uid | int | 是 | 否 | 用户id |
3 | cnum | int | 购买数量 |
mysql> CREATE TABLE cart
-> (gid int,
-> uid int,
-> cnum int,
-> PRIMARY KEY(gid,uid) #定义复合主键
->);
Query OK, 0 rows affected (0.02 sec)
NOT NULL约束也称非空约束 强制字段的值不能为NULL,它不等同于0或空字符串,也不能跟任何值进行比较。 NOT NULL只能用作约束使用。
属性名 数据类型 NOT NULL
为商品goods添加字段gcode(商品编号),类型为varchar(50),不为NULL,并将其放置gid字段之后。
mysql> ALTER TABLE goods
-> ADD gcode varchar(50) NOT NULL AFTER gid ;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
DEFAULT约束即默认值约束,用于指定字段的默认值。 当向表中添加记录时,若未为字段赋值,数据库系统会自动为将字段的默认值插入。
属性名 数据类型 DEFAULT 默认值
修改购物车表cart,将购买数量的默认值设置为1。
mysql> ALTER TABLE cart
-> MODIFY cnum int DEFAULT 1 ; #修改默认值为1
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
UNIQUE约束又称唯一性约束,是指数据表中一列或一组列中只包含唯一值。
属性名 数据类型 UNIQUE
修改users_new表,为字段登录名ulogin添加UNIQUE约束。
mysql> ALTER TABLE users_new
-> MODIFY ulogin varchar(50) UNIQUE ;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
CHECK约束是列输入数据值的验证规则,列中输入数据必须满足CHECK约束的条件,否则无法写入数据库。 MySQL 8.0开始支持CHECK约束。
CONSTRAINT 约束名 CHECK ( 表达式 )
修改goods表,为商品价格添加CHECK约束,要求价格必须大于0等于。
mysql> ALTER TABLE goods
-> ADD CONSTRAINT ck_gprice CHECK(gprice >= 0) ;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
用Navicat图形工具创建外键约束
创建商品类型表category和商品goods表,category表结构如表3-10所示,goods表结构如表3-11所示。其中主表为category,从表为goods。
序号 | 字段 | 数据类型 | 主键 | 外键 | 允许空 | 说明 |
---|---|---|---|---|---|---|
1 | cid | int | 是 | 否 | 类别id | |
2 | cname | varchar(30) | 否 | 类别名称 |
序号 | 字段 | 数据类型 | 主键 | 外键 | 允许空 | 说明 |
---|---|---|---|---|---|---|
1 | gid | int | 是 | 否 | 商品id | |
2 | cid | int | 是 | 否 | 类别id | |
3 | gcode | varchar(50) | 否 | 商品编号 | ||
4 | gname | varchar (200) | 否 | 商品名称 | ||
5 | gprice | decimal(20,2) | 商品价格 |
使用SQL语句添加外键约束
CONSTRAINT 外键名 FOREIGN KEY(外键字段名)
REFERENCES 主表名(主键字段名)
mysql> ALTER TABLE goods
-> ADD CONSTRAINT fk_goods_cid FOREIGN KEY(cid) REFERENCES
category(cid);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
外键约束的级联更新和删除 外键约束实现了表间的引用完整性,当主表中被引用列的值发生变化时,为了保证表间数据的一致性,从表的中与该值相关的信息也应该相应更新,这就是外键约束的级联更新和删除。
CONSTRAINT 外键名 FOREIGN KEY(外键字段名)
REFERENCES 主表名(主键字段名)
[ON UPDATE { CASCADE | SET NULL | NO ACTION | RESTRICT }]
[ON DELETE { CASCADE | SET NULL | NO ACTION | RESTRICT }]
ALTER TABLE 表名 DROP 约束类型 [约束名];