Java学习笔记 --- MySQL-约束
创始人
2024-05-02 06:13:02
0

一、基本介绍

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

二、primary key(主键)-基本使用

字段名  字段类型 PRIMARY KEY

用于唯一的标识表行的数据,当定义主键约束后,该类不能重复

细节说明:
1、primary key不能重复而且不能为null

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

3、主键的指定方式有两种

      1. 直接在字段后面指定:字段名 primary key

      2. 在表定义最后写 primary key(列名)

4、使用desc 表名,可以看到primary key的情况

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

-- 主键的使用-- id name email
CREATE TABLE t14(id INT PRIMARY KEY, -- 表示id列是主键`name` VARCHAR(32),email VARCHAR(32)
);-- 主键列的值是不可以重复的
INSERT INTO t14 VALUES(1, 'jack', 'jack@qq.com');
INSERT INTO t14 VALUES(2, 'tom', 'tom@qq.com');
INSERT INTO t14 VALUES(1, 'smith', 'smith@qq.com');-- 主键使用的细节讨论
-- primary key不能重复而且不能为null
INSERT INTO t14 VALUES(NULL, 'smith', 'smith@qq.com');-- 一张表最多只能有一个主键,但可以是复合主键(比如id + name)
CREATE TABLE t15(id INT PRIMARY KEY, -- 表示id列是主键`name` VARCHAR(32) PRIMARY KEY, -- 错误的email VARCHAR(32)
);-- 演示复合主键(id 和 name 做成复合主键)
CREATE TABLE t15(id INT,`name` VARCHAR(32),email VARCHAR(32),PRIMARY KEY(id, `name`) -- 复合主键
);INSERT INTO t15 VALUES(1, 'jack', 'jack@qq.com');
INSERT INTO t15 VALUES(1, 'tom', 'tom@qq.com');
INSERT INTO t15 VALUES(1, 'tom', 'xx@qq.com'); -- 这里违反了复合主键-- 主键的指定方式有两种
-- 1. 直接在字段后面指定:字段名 primary key
CREATE TABLE t16(id INT,`name` VARCHAR(32) PRIMARY KEY,email VARCHAR(32)
);--       2. 在表定义最后写 primary key(列名)
CREATE TABLE t17(id INT,`name` VARCHAR(32),email VARCHAR(32),PRIMARY KEY(`name`)
);-- 4、使用desc 表名,可以看到primary key的情况
DESC t14SELECT * FROM t14
SELECT * FROM t15

三、not null(非空)

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

字段名 字段类型 not null

四、unique(唯一) 

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

字段名 字段类型 unique

细节说明:

1、如果没有指定not null,则unique字段可以有多个null

2、一张表可以有多个unique字段

-- unique 的使用CREATE TABLE t18(id INT UNIQUE, -- 表示id列是不可以重复的`name` VARCHAR(32),email VARCHAR(32)
);INSERT INTO t18 VALUES(1, 'jack', 'jack@qq.com');
INSERT INTO t18 VALUES(1, 'tom', 'tom@qq.com'); -- 错误的-- 细节说明:
-- 
-- 1、如果没有指定not null,则unique字段可以有多个null
--      如果一个列(字段), 是 unique not null 使用效果类似 primary key
INSERT INTO t18 VALUES(NULL, 'tom', 'tom@qq.com');-- 2、一张表可以有多个unique字段
CREATE TABLE t19(id INT UNIQUE, -- 表示id列是不可以重复的`name` VARCHAR(32) UNIQUE, -- 表示 name 也不可以重复email VARCHAR(32)
);
DESC t19SELECT * FROM t18

五、 foreign key(外键)

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

FOREIGN KEY(本表字段名)  REFERENCES

主表名(主键名或unique字段名)

细节说明:
1、外键指向的表的字段,要求是primary key或者是unique

2、表的类型是innodb,这样的表才支持外键

3、外键字段的类型要和主键字段的类型一致(长度可以不同)

4、外键字段的值,必须在主键字段中出现过,或者为null【前提是外键字段允许为null】

5、一旦建立主外键的关系,数据不能随意删除了

-- 外键演示-- 创建主表 my_class
CREATE TABLE my_class (id INT PRIMARY KEY, `name` VARCHAR(32)NOT NULL DEFAULT ' '
);
INSERT INTO my_class VALUES(100, 'java'), (200, 'web')
INSERT INTO my_class VALUES(300, 'php')-- 创建从表 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_stu VALUES(1, '张三', 100), (2, '李四', 200)
INSERT INTO my_stu VALUES(3, '老六', 300) 
INSERT INTO my_stu VALUES(4, '王五', 400) -- 错误的,因为400班级不存在
INSERT INTO my_stu VALUES(5, '铁蛋', NULL) -- 可以添加,因为外键没有写 not null-- 一旦建立主外键的关系,数据不能随意删除了
DELETE TABLE my_class WHERE id = 100;SELECT * FROM my_class
SELECT * FROM my_stu

六、check

用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不再1000~2000之间就会提示出错

提示:oracle和sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效

列名  类型 CHECK(check条件)

-- 演示check的使用
-- mysql5.7目前还不支持check,只做语法校验,但不会生效
-- 学习 oracle, sql server, 这两个数据库是真的生效.-- 测试
CREATE TABLE t20 (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 t20 VALUES(1, '张三', 'm', 1) -- 添加成功了SELECT * FROM t20

七、自增长

字段名  整型  PRIMARY KEY AUTO_INCREMENT

添加 自增长的字段方式:

inser into xxx(字段1,字段2.....)values(null,'值' ....);

inser into xxx(字段2.....)values('值1','值2' ....);

inser into xxx values(null,'值1',....);
 

使用细节:
1、 一般来说自增长是和primary key配合使用的

2、自增长也可以单独使用【但是需要配合一个unique】

3、自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用)

4、自增长默认从1开始,可以通过如下命令修改:alter table 表名 auto_increment = 新的开始值

5、如果添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定了自增长,一般来说就按照自增长的规则来添加数据 

-- 演示自增长的使用
CREATE TABLE t21(id INT PRIMARY KEY AUTO_INCREMENT,email VARCHAR(32) NOT NULL DEFAULT ' ',`name` VARCHAR(32 ) NOT NULL DEFAULT ' '
);-- 测试自增长
INSERT INTO t21 VALUES(NULL, 'jack@qq.com', 'jack');
INSERT INTO t21 VALUES(NULL, 'tom@qq.com', 'tom');INSERT INTO t21 (email, `name`) VALUES('mary@qq.com', 'mar');DESC t21
SELECT * FROM t21-- 修改默认的自增长值
ALTER TABLE t22 AUTO_INCREMENT = 100;
CREATE TABLE t22(id INT PRIMARY KEY AUTO_INCREMENT,email VARCHAR(32) NOT NULL DEFAULT ' ',`name` VARCHAR(32 ) NOT NULL DEFAULT ' '
);INSERT INTO t22 VALUES(NULL, 'jack@qq.com', 'jack');
INSERT INTO t22 VALUES(NULL, 'tom@qq.com', 'tom');-- 如果添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,
-- 如果指定了自增长,一般来说就按照自增长的规则来添加数据
INSERT INTO t22 VALUES(666, 'mary@qq.com', 'mar');SELECT * FROM t22;

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...