MySQL(六):mysql 约束

基本介绍:约束用于确保数据库的数据满足特定的商业规则,约束包括:not null、unique、primary key、foreign key 、check五种。

一、主键的使用(primary key)

字段名 字段类型 primary key

用于唯一的表示表行的数据,当定义主键约束后,该列不能重复。

#主键的使用 primary key


	

INSERT INTO t17 VALUES(1,'tom','tom.suhu.com'),
		(2,'jack','jack.sohu.com');
		
 -- 设定为主键的列不能重复
INSERT INTO t17 VALUES(1,'grace','grace.sohu.com');

SELECT * FROM t17;

-- 主键使用的细节
-- primary key 不能重复且不能为空
INSERT INTO t17 VALUES(NULL,'grace','grace.sohu.com');

-- 一张表中最多只能有一个主键,但可以是复合主键

CREATE TABLE t18(
	id INT PRIMARY KEY,-- id是主键
	`name` VARCHAR(32) PRIMARY KEY, --错误的
	email VARCHAR(32));

-- 复合主键

CREATE TABLE t18(
	id INT,
	`name` VARCHAR(32),
	email VARCHAR(32),
	PRIMARY KEY (id,`name`));-- 复合主键
	
INSERT INTO t18 VALUES(1,'tom','grace.sohu.com');
INSERT INTO t18 VALUES(1,'jack','jack.suhu.com');-- 主键只有部分相同,可以成功
INSERT INTO t18 VALUES(1,'tom','xx.sohu.com'); -- 主键完全相同,不能插入

SELECT * FROM t18;

-- 主键的指定方式有两种
-- 1、直接在字段名后指定: 字段名 字段类型 primary key
-- 2、在表定义最后写primary key(字段名)

-- 查询表中的主键方法desc
DESC t17;
DESC t18;

-- 在实际开发中,每个表往往都会设计一个主键

二、非空(not null)

如果在列上定义了非空 not null,那么在插入数据时,必须为列提供数据

字段名 字段类型 not null

三、unique(唯一)

当定义了唯一约束后,该列值是不能重复的

字段名 字段类型 unique
#unique的使用

CREATE TABLE t20(
	id INT UNIQUE,
	`name` VARCHAR(32),
	email VARCHAR(32));

INSERT INTO t20 VALUES(1,'jack','jack.com');
SELECT * FROM t20
INSERT INTO t20 VALUES(1,'tom','tom.com');

-- unique细节
-- 1、如果没有指定not null,则unique 字段可以有多个null
-- 如果一个列(字段—),是unique not null约束的,那么使用效果类似于primary key
INSERT INTO t20 VALUES(NULL,'tom','tom.com');


-- 2、一张表可以有多个unique字段
CREATE TABLE t21(
	id INT UNIQUE,
	`name` VARCHAR(32) UNIQUE,
	email VARCHAR(32));
	
DESC t21;
INSERT INTO t21 VALUES(1,'jack','jack.com');

四、外键(foreign key)

用于定义主表和从表之间的关系:外键约束要定义在从表上,主表则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null

foreign key (本表字段名) references
主表名(主键名或unique字段名)

在这里插入图片描述

#外键演示

-- 创建主表myclass
CREATE TABLE my_class(
	id INT PRIMARY KEY, -- 班级编号
	`name` VARCHAR(32) NOT NULL DEFAULT ' ');


-- 创建从表my_stu
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));
	

INSERT INTO my_class VALUES(100,'java'),(2,'web');
SELECT * FROM my_class;


INSERT INTO my_stu VALUES(1,'jack',100);

INSERT INTO my_stu VALUES(2,'tom',200); -- 失败,因为200班级不存在
INSERT INTO my_stu VALUES(3,'cindy',2);

SELECT * FROM my_stu;

#注意
-- 1、外键指向表的字段,必须是primary或者unique类型
-- 2、表的类型是innodb,这样的表才支持外键
-- 3、外键字段的类型要和主键字段的类型一致(长度可以不同)
-- 4、外键字段的值,必须在主键字段中出现过,或者为null(前提是外键字段允许为null)
INSERT INTO my_stu VALUES(4,'mary',NULL); -- 可以,外键没有写not null
-- 5、一旦建立主外键的关系,数据不能随意删除
DELETE FROM my_class 
	WHERE id=100;  -- 不能执行,有一个外键指向了100

五、check

用于强制数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在这个区间内就会提示出错。
oracle和sql server均支持check名单时mysql5.7不支持,只做语法校验,但不会生效

列名 类型 check(check 条件)

#check演示

CREATE TABLE t23(
	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 t23 VALUES(1,'mary','man',1000);  -- 失败

INSERT INTO t23 VALUES(1,'mary','kid',2000);   -- 失败

INSERT INTO t23 VALUES(1,'mary','man',1200);   -- 成功

SELECT * FROM t23;

六、案例

在这里插入图片描述


DROP TABLE goods;
DROP TABLE customer;
CREATE TABLE goods(
	goods_id INT PRIMARY KEY,
	goods_name VARCHAR(32),
	unitprice DECIMAL(10,2) 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 INT PRIMARY KEY,
	`name` VARCHAR(32) NOT NULL DEFAULT ' ',
	address VARCHAR(32) NOT NULL DEFAULT ' ',
	email VARCHAR(100) UNIQUE NOT NULL,
	-- sex varchar(32) check(sex in ('man','woman')),
	sex ENUM('man','woman') NOT NULL,
	card_id INT);


CREATE TABLE purchase(
	order_id INT UNSIGNED PRIMARY KEY,
	customer_id INT NOT NULL DEFAULT 0,
	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)
	);

七、自增长

在某张表中,存在一个id列(整数),希望在添加记录的时候,该列从1开始,自动的增长

字段名 整型 primary key auto_increment

添加自增长的字段的方式
insert into XXX(字段1,字段2,..) values(null,'值‘);
insert into XXX(字段2...) values('值1’,'值2');
insert into XXX values(null,’值1')
#演示自增长

-- 创建表
CREATE TABLE t24(
	id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(32) NOT NULL DEFAULT ' ',
	`name` VARCHAR(32) NOT NULL DEFAULT ' ');

DESC t24

INSERT INTO t24 VALUES(NULL,'jack.com','jack');
INSERT INTO t24 VALUES(NULL,'tom.com','tom');


INSERT INTO t24(email,`name`) VALUES('cindy.com','cindy');
SELECT * FROM t24;

-- 细节
-- 1、auto_increment需要和primary key 或者 unique
-- 2、自增长修饰的字段为整数型(小数很少用)
-- 3、自增长默认从1开始,也可以通过alter table 表名 auto_increment= 新的开始值

CREATE TABLE t25(
	id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(32) NOT NULL DEFAULT ' ',
	`name` VARCHAR(32) NOT NULL DEFAULT ' ');
ALTER TABLE t25 AUTO_INCREMENT=10;

INSERT INTO t25 VALUES(NULL,'jack.com','jack');
INSERT INTO t25 VALUES(NULL,'tom.com','tom');


INSERT INTO t25(email,`name`) VALUES('cindy.com','cindy');
SELECT * FROM t25;


-- 4、如果添加数据时,给自增长字段指定值,则以指定值为准,其后的值从指定值开始增长,一般来说,就按照自增长的规则来添加数据
INSERT INTO t25 VALUES(666,'grace','grace.com');
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值