约束
基本介绍
约束用于确保数据库的数据满足特定的商业规则。在 MySQL 中,约束包括: not null、unique、primary key、foreign key 和 check
五种。
primary key (主键)
1.用于唯一标识每条记录,字段添加后,该列的所有值不能重复。主键默认不能为 null
2.一张表只能有一个主键,但可以是复合主键
3.添加 primary key 主键可以:1.字段名 primary key;2.所有字段后 primary key (字段名)
4.使用 desc 表名,可以查看那个字段是 primary key
// 主键
CREATE TABLE tab01(
id INT PRIMARY KEY ,
username VARCHAR (32)
);
// 复合主键,插入数据时,只要有一个字段不同,就不会报错
CREATE TABLE tab02(
id INT,
username VARCHAR (32),
PRIMARY KEY (id, username)
);
INSERT INTO tab02 VALUES (1, 'Gin'),(2, 'Gin'),(2, 'Vodka');
not null ( 非空 )
如果在列上定义了 not null
,那么当插入数据时,必须为列提供数据。
unique ( 唯一 )
当定义了唯一约束后,该列值是不能重复的
如果没有指定 not null
,则 unique
字段可以有多个 null
一张表可以有多个 unique
字段
foreign key 外键约束
用于定义主表和从表之间的关系:外键约束要定义在从表上,主表则必须具有主键约束或是 unique
约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为 null
如下:学生表为 从表,班级表为 主表
细节
- 外键指向的表的字段,要求是
primary key
或者是unique
- 表的类型是
innodb
,这样的表才支持外键 - 外键字段的类型要和主键字段的类型一致(长度可以不同)
- 外键字段的值,必须在主键字段中出现过,或者为
null
【前提是外键字段允许为null】 - 一旦建立主外键的关系,数据不能随意删除了。
// FOREIGN KEY 外键约束
// 创建表
CREATE TABLE my_class(
id INT PRIMARY KEY,
name VARCHAR (32) NOT NULL DEFAULT ''
);
INSERT INTO my_class VALUES (100, 'Java'),(200, 'Web');
CREATE TABLE my_stu(
id INT PRIMARY KEY,
name VARCHAR (32) NOT NULL DEFAULT '',
class_id INT,
FOREIGN KEY (class_id) REFERENCES my_class(id)
);
// 从表中定义外键时,只要不设置外键 NOT NULL,则在插入数据时可以插入外键值为 NULL 的数据
INSERT INTO my_stu VALUES (1, 'Gin', 200),(2, 'Vodka', 100),(3, 'Vermouth', null);
check
用于强制行数据必须满足的条件,假定在 sal
列上定义了 check
约束,并要求 sal
列值在 1000 - 2000
之间如果不再 1000~2000
之间就会提示出错。
// check 约束
// 创建表
CREATE TABLE person(
id INT PRIMARY KEY ,
name VARCHAR (32),
sex VARCHAR (6) CHECK (sex IN ('man', 'woman')),
sal DOUBLE CHECK ( sal > 1000 AND sal < 2000 )
);
INSERT INTO person VALUES (1, 'Gin', '男', '5000'); // 报错
练习创建表
// 练习
// 现有一个商店的数据库shop_db,记录客户及其购物情况,由下面三个表组成:
// 商品goods(商品号goods_id,商品名goods_name,单价unitprice,商品类别category,供应商provider);
// 客户customer(客户号customer_id,姓名name,住址address,电邮email性别sex,身份证card_id);
// 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums);
create database shop_db;
use shop_db;
create table goods(
goods_id int primary key,
goods_name varchar (100) not null default '',
unitprice double check (unitprice >= 1.0 and unitprice <= 9999.99),
category int not null default 0,
provider varchar (32) not null default ''
);
create table customer(
customer_id varchar (8) primary key,
name varchar (32) not null default '',
address varchar (100) not null default '',
email varchar (50) unique not null,
sex enum('男', '女') not null,
card_id varchar (18)
);
create table purchase(
order_id int primary key,
customer_id varchar (8) not null default '',
goods_id int not null default 0,
nums int not null default 0,
foreign key (customer_id) references customer(customer_id),
foreign key (goods_id) references goods(goods_id)
);
auto_increment 自增长
自增长使用细节
- 一般来说自增长是和
primary key
配合使用的 - 自增长也可以单独使用【但是需要配合一个unique】
- 自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用)
- 自增长默认从 1 开始,你也可以通过如下命令修改
alter table 表名 auto_increment = 新的开始值;
- 如果你添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定了自增长,一般来说,就按照自增长的规则来添加数据