MySQL1(初始数据库 概念 DDL建库建表 数据库的三大范式 表约束)

news2024/10/5 18:28:00

目录

一、初始数据库

二、概念 

三、DDL建库建表 

1. 数据库结构

2. SQL语句分类

3. DDL语句操作数据库 

注释:

查看数据库:

​编辑创建数据库:

删除数据库:

选择数据库:

4. 数据库表的字段类型

4.1 字符串类型

4.2 数值类型

4.3 日期和时间类型

4.4 NULL类型

5. DDL操作数据库表

6. 数据库表的字段注释

查询创建的数据库结构

7. 数据库存储引擎(⭐) 

7.1 数据库存储引擎-InnoDB

7.2 数据库存储引擎-MyISAM 

7.3 区别(⭐)

8. 修改和删除数据库

修改表名:

添加字段:

删除字段:

修改字段:

删除表:

四、数据库的三大范式 

1. 什么是范式

2. 约束作用

3. 三范式

4. 第一范式(1NF)

5. 第二范式(2NF)

6. 第三范式(3NF)

7. 总结 

五、表约束

1. 概念

2. 约束作用

3. 约束种类

4. 非空约束

5. 唯一约束

6. 主键约束(primary key)PK

复合主键(表级定义)

分类

7. 外键约束(foreign key)FK

分类

8. 约束的添加和删除

添加 

删除


一、初始数据库

  • 数据的保存:大量程序产生的数据在程序 运行时和程序结束运行后 数据应该怎么保存?
  • 数据的读取:普通的文本文档在写数据时虽然方便,但是在读取数据 时则比较麻烦,需要根据各种形式去做转化。 怎么才能读取更方便?
  • 数据的完整性:数据和数据之间的结构关系, 数据和程序之间的依赖关系, 如何能让这些关系持久维系?
  • 数据的安全性:如何防止数据因为硬件故障、 断电、死机、人为的误操作、 程序缺陷、病毒或黑客等造成的丢失?
  • 结构化:数据在数据库中的存储可以依靠二 维表结构来逻辑的存储数据,可以参考数据原有的依赖关系和结构关系去存储数据。        
  • 独立性:存储在数据库的数据和应用程序之间相互独立, 互不影响。数据在磁盘上怎样存储由数据库管理而不依赖于应用程序,这样当数据的物理存储改变了,应用程序不用改变。
  • 共享性:2 4 多个用户可以共同分享计算机数据 库中的数据资源,同一数据可以同时被多人使用,从而实现了数据的高效共享性。
  • 安全性: 数据库在安全性的控制上也有很多措施,比如访问数据库时对用户的口令,用户的权限进行限制,再比如对数据的存储进行限制。

二、概念 

数据库( Database ,简称 DB )长期存放在计算机内,有组织、可共享的大量数据的集合,是一个 数据“仓库”。mysql单表2000w)

作用:存放、管理数据

分类:关系型数据库、NoSQL数据库。

MySQL特点:

  • 操作便捷
  • 小巧,功能齐全
  • 免费、开源的数据库
  • 可运行于windows或linux系统

三、DDL建库建表 

1. 数据库结构

  • 数据库(Database):以文件的形式存放在磁盘上,即对应于一个或多个物理文件。
  • 数据表(Table):简称表,由一组数据记录组成, 数据库中的数据是以表为单位进行组织的。一个表是一组相关的 按行排列的数据;每个表中都含有相同类型的信息。
  • 字段(Field):也称域。表中的每一列称为一个字段。每个字段都有相应的描述信息。
  • 记录(Record):表中的每一行称为一个记录,它由若干个字段组成。实体
  • 索引(Index):索引实际上是一种特殊类型的表, 其中含有关键字段的值和指向实际记录位置的指针,可以提高访问数据库的效率。
  • SQL语句:结构化查询语句命令,用来从一 个或多个表中获取一组指定的记录,或者对某个表执行指定的操作。

2. SQL语句分类

        SQL语句,即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。

名称英文全称解释常用命令

DDL

(数据定义语言)

Data Definition Language

用于定义和管理数据象,如数据库、表等结构

CREATE, DROP, ALTER

DML

(数据操作语言)

Data Manipulation Language用于对数据库中数据的增删改操作INSERT, UPDATE, DELETE

DQL

(数据查询语言)

Data Query Language用于从数据库中检索数据SELECT

DCL

(数据控制语言)

Data Control Language用于管理数据库权限和数据的事务控制GRANT, COMMIT, ROLLBACK

3. DDL语句操作数据库 

注释:

#单行注释
-- 单行注释
/*

多行
注释

*/

查看数据库:

  #库的操作
#查看所有的库名
-- 所有的关键词一般都会变颜色
-- sql 语句不区分大小写(关键词一般大写)
-- 每一条sql都应该加一个分号结束
show databases;

创建数据库:

-- 创建一个库(库名不要用中文,使用下划线进行单词分割)
-- create  databases 库名;
create database myschool;

删除数据库:

-- 删除库 (危险操作)
-- drop database 库名;
drop database myschool;

选择数据库:

-- 使用库
use myschool;

4. 数据库表的字段类型

4.1 字符串类型

类型说明取值范围存储需求
char(M)固定长度字符串,检索快但可能浪费空间0 <= M <= 255固定长度,M字节
varchar(M)可变长度字符串M字符最多65535字节(对于MySQL较旧版本,新版本VARCHAR的最大长度提高至65535)
tinytext微型文本字符串约等于2^8(256)个字符L + 1字节,L为字符数,最大长度255个字符
text文本字符串约等于2^16(65536)个字符L + 3字节,L为字符数,理论上最大长度65535个字符
mediumtext中等长度文本字符串约等于2^24(16777216)个字符L + 4字节,L为字符数,最大长度约16777215个字符
longtext长文本字符串约等于2^32(4294967296)个字符L + 4字节,L为字符数,最大理论长度约4GB
char和varchar比较
类型特点空间上时间上适用场景
CHAR(M)固定长度浪费存储空间效率高存储不大,速度要求高
VARCHAR(M)可变长度节省存储空间效率低非CHAR的情况

4.2 数值类型

类型说明取值范围存储需求
TINYINT非常小的数据有符号: -2^7 ~ 2^7-1,无符号值:0~28-11 字节
SMALLINT较小的数据有符号: -2^15 ~ 2^15-1,无符号值:0~2^16-12 字节
MEDIUMINT中等大小的数据有符号: -2^23 ~ 2^23-1,无符号值:0~2^24-13 字节
INT标准整数有符号: -2^31 ~ 2^31-1,无符号值:0~2^32-14 字节
BIGINT较大的整数有符号: -2^63 ~2^63-1,无符号值:0~2^64-18 字节
FLOAT单精度浮点数±1.17549435e-384 字节
DOUBLE双精度浮点数±2.2250738585072014e-3088 字节
DECIMAL(钱)字符串形式的浮点数decimal(m,d)m 个字节
常考点:Mysql 关于 int(1) 和 int(11)?
                int (1)  在mysql 里面 是指 显示 长度  !!! int() 加数字 为显示规则 宽度

4.3 日期和时间类型

类型说明取值范围存储需求
DATEYYYY-MM-DD,日期格式1000-01-01~9999-12-31DATE
TIMEHh:mm:ss,时间格式-838:59:59~838:59:59TIME
DATETIMEYY-MM-DD hh:mm:ss1000-01-01 00:00:00 至 9999-12-31 23:59:59DATETIME
TIMESTAMP【stamp】YYYMMDDhhmmss格式表示的时间戳197010101000000~2037年的某个时刻TIMESTAMP
YEARYYYY格式的年份值1901~2155YEAR
        设置当前 创建时间,或者是更新时间时给TIMESTAMP或者DATETIME字段 设置 DEFAULT CURRENT_TIMESTAMP 添加当前默认时间

4.4 NULL类型

  • 理解为“没有值”或“未知值”;
  • 不要用NULL进行算术运算,结果仍为NULL;
  •  MySQL中,0或NULL都意味着为假,1为真。

5. DDL操作数据库表

查看表:

#表的操作
-- 查看当前库的所有表
show tables;

创建表: 

语法格式:

CREATE   TABLE [ IF NOT EXISTS ] `表名`   (

 `字段名1` 字段类型 [ 属性]  [ 索引] [注释] ,
 `字段名2` 字段类型 [属性]  [索引] [注释] , 
… …    
`字段名n` 字段类型 [属性]  [ 索引] [注释] 

)  [ 表类型 ] [ 表字符集 ] ;

其中:
“[]” 包含的内容可以省略;
“`” 当前符号为反引号,用于区别MySQL保留字与普通字符而引入的。
-- 创建表
create table 表名 (
	-- 字段名不区分大小写,不能使用sql中的关键词
	-- 字段名通过下划线进行单词分割
	-- 不要超过255个字符
	字段名 字段类型 字段的属性,
	-- 数据类型: 字符串 (char,varchar | tinytext text)
	-- char固定,varchar可变 括号内是其最大长度 如果写多直接报错
	-- char(5) 一定要满足5个 
	-- varchar(5) 可变
    -- 数值、日期、null
	字段名 字段类型 字段的属性 ,...字段名 字段类型 字段的属性
);

create table student(
	stu_name varchar(10),
	stu_age tinyint,
	stu_birthday datetime,
	stu_score decimal(4,1)
);

-- 字符串的表现形式 '' ""
create table teacher(
	tname varchar(10) comment '老师姓名',
	tsex varchar(2) comment "老师的性别"
);

6. 数据库表的字段注释

语法格式:

CREATE   TABLE [ IF NOT EXISTS ]    `表名`   (

 `字段名1`    字段类型 [ 属性]  [ 索引] [注释] ,
 `字段名2`    字段类型 [ 属性]  [ 索引] [注释] , 
… …    
       `字段名n`    字段类型 [ 属性]  [ 索引] [注释] 

)  [ 表类型] [ 表字符集] ;
-- 字符串的表现形式 '' ""
create table teacher(
	tname varchar(10) comment '老师姓名',
	tsex varchar(2) comment "老师的性别"
);

注释:可以给字段增加注释,即给字段增加描述,方便后续修改和维护字段。

查询创建的数据库结构

方式一:

descirbe 表名
或 desc 表名
-- 如何查看表结构
-- 1.方式
desc student;

desc teacher;

方式二:

show create table 表名
-- 2.方式
show create table student;

-- ` 反引号 -- 取消关键性
-- DEFAULT NULL 默认null
-- DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 字符集,排序集
-- ENGINE=InnoDB 存储引擎

student	CREATE TABLE `student` (
  `stu_name` varchar(10) DEFAULT NULL,
  `stu_age` tinyint(4) DEFAULT NULL,
  `stu_birthday` datetime DEFAULT NULL,
  `stu_score` decimal(4,1) DEFAULT NULL
) 

7. 数据库存储引擎(⭐) 

查看当前数据库支持的存储引擎:
show engines;

7.1 数据库存储引擎-InnoDB

  • MySQL从3.23.34a开始就包含InnoDB存储引擎。大于等于5.5之后,默认采用InnoDB引擎。
  • InnoDB是MysQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交 (Commit)和回滚(Rollback)。
  • 除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎。
  • 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
  •  数据文件结构:  
    • 表名.frm存储表结构(MySQL8.0时,合并在表名.ibd中)。
    • 表名.ibd存储数据和索引
  •  InnoDB是为处理巨大数据量的最大性能设计。 
    • 在以前的版本中,字典数据以元数据文件、非事务表等来存储。现在这些元数据文件被删除了。比 如: .frm,.par , .trn ,.isl, .db.opt等都在MySQL8.0中不存在了。
  • 对比MylISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保存数据和索引。
  • MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性 能有决定性的影响

7.2 数据库存储引擎-MyISAM 

  • MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外 键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
  • 5.5之前默认的存储引擎 • 优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用
  • 针对数据统计有额外的常数存储。故而count(*)的查询效率很高
  • 数据文件结构:
    • 表名.frm存储表结构。
    • 表名.MYD存储数据(MYData)。
    • 表名.MYI存储索引 (MYIndex)
  • 应用场景:只读应用或者以读为主的业务

7.3 区别(⭐)

对比项MyISAMInnoDB
外键不支持支持
事务不支持支持
行表锁表锁,即使操作一条记录也会锁住整个表,不适合高并发操作行锁,操作时只锁某一行,不对其它行有影响,适合高并发操作
缓存只缓存索引,不缓存真实数据不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响
默认安装YY
默认使用NY
关注点性能:节省资源、消耗少、简单业务事务:并发写,事务、更大资源

 两种存储引擎各有特点,当然你也可以在MySQL中,针对不同的数据表,可以选择不同的存储引擎。

8. 修改和删除数据库


修改表名:

-- 修改表结构
-- 修改表名
-- alter table 旧表名 rename as 新表名;
alter table student rename as xuesheng;

show tables;


添加字段:

-- 添加一个字段 ***
-- alter table 表名 add 字段名 类型 属性;
alter  table teacher add taddr varchar(200) comment '老师的住址';

show create table teacher;

运行结果
CREATE TABLE `teacher` (
  `tname` varchar(10) DEFAULT NULL COMMENT '老师姓名',
  `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

删除字段:

-- 删除字段 (危险操作)
-- alter table 表名 drop 字段名

alter table xuesheng drop stu_age;

show create table xuesheng;

原始结果
CREATE TABLE `xuesheng` (
  `stu_name` varchar(10) DEFAULT NULL,
  `stu_age` tinyint(4) DEFAULT NULL,
  `stu_birthday` datetime DEFAULT NULL,
  `stu_score` decimal(4,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci


删除后结果
CREATE TABLE `xuesheng` (
  `stu_name` varchar(10) DEFAULT NULL,
  `stu_birthday` datetime DEFAULT NULL,
  `stu_score` decimal(4,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

修改字段:

方式一:

-- 修改字段
-- 覆盖式 默认值填进去
-- 方式一
-- alter table 表名 modify 字段名 要修改的类型 要修改的属性


alter table teacher modify tname varchar(10) comment '姓名';
-- 原始结果
CREATE TABLE `teacher` (
  `tname` varchar(10) DEFAULT NULL COMMENT '老师姓名',
  `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
--运行结果
CREATE TABLE `teacher` (
  `tname` varchar(10) DEFAULT NULL COMMENT '姓名',
  `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
alter table teacher modify tname varchar(100);
CREATE TABLE `teacher` (
  `tname` varchar(100) DEFAULT NULL,
  `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
alter table teacher modify tname float;
CREATE TABLE `teacher` (
  `tname` float DEFAULT NULL,
  `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

方式二:

-- 方式二 可以改字段名
-- alter table 表名 change 旧字段名 新字段名 要修改的类型 要修改的属性
alter table teacher change tname xingming varchar(10) comment '老师的姓名';

CREATE TABLE `teacher` (
  `xingming` varchar(10) DEFAULT NULL COMMENT '老师的姓名',
  `tsex` varchar(2) DEFAULT NULL COMMENT '老师的性别',
  `taddr` varchar(200) DEFAULT NULL COMMENT '老师的住址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

删除表:

-- 删除表(删除表危险操作)
drop table teacher;
show tables;

四、数据库的三大范式 

1. 什么是范式

        为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。 在关系型数据库中这种规则就叫做范式。        

2. 约束作用

        数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结 构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。

3. 三范式

  • 第一范式:确保每列保持原子性
  • 第二范式:确保表中的每列都和主键相关
  • 第三范式:确保每列都和主键列直接相关,而不是间接相关 

4. 第一范式(1NF)

第一范式(1NF)确保每列保持原子性

  • 每一列属性都是不可再分的属性值,确保每一列的原子性
  • 两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据

地址可再分 故继续拆表

5. 第二范式(2NF)

第二范式(2NF)属性完全依赖于主键

  • 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的。即满足第二范式必须先满足第一范式。
  • 第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键   

        每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。

        一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。

6. 第三范式(3NF)

第三范式(3NF)属性不依赖于其它非主属性属性直接依赖于主键

        数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系

像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。

比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号--> 所在院校--> (院校地址,院校电话) 这样的表结构,我们应该拆开来,

如下。 (学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)

7. 总结 

        三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。 如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结 构。所以不能一味的去追求范式建立数据库

五、表约束

1. 概念

约束实际上就是表中数据的限制条件

2. 约束作用

表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效 

3. 约束种类

  • 非空约束(not null)
  • 唯一性约束(unique)
  • 主键约束(primary key) PK
  • 外键约束(foreign key) FK
  • 检查约束(目前MySQL不支持、Oracle支持)

4. 非空约束

用not null约束的字段不能为null值,必须给定具体的数据

  • 默认,所有的类型的值都可以是NULL,包括INT、FLOAT等数据类型
  • 非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空
  • 一个表可以有很多列都分别限定了非空
  • 空字符串"不等于NULL,0也不等于NULL
# 约束
-- 非空约束
# 约束
-- 非空约束
create table tb1(
	tname varchar(10),
	tage int
);

create table tb2(
	tname varchar(10) not null default '无名',
	tage int
);

show create table tb2;
tb2	CREATE TABLE `tb2` (
  `tname` varchar(10) NOT NULL DEFAULT '无名',
  `tage` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

正常不写会添加失败 因为默认为null

设置name字段默认值为无名

5. 唯一约束

unique约束的字段,具有唯一性,不可重复,但可以为null

  • 同一个表可以有多个唯一约束。
  • 唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
  • 唯一性约束允许列值为空
  • 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
  • MySQL会给唯一约束的列上默认创建一个唯一索引。
-- 唯一约束
create table tb3(
	tname  varchar(10) unique,
	tage int
);

如果插入相同的两个tname就会报错


 
create table tb4(
	tname  varchar(10) unique, -- 行级约束
	tage int unique
);

如果tname tage 全部相同 则添加失败

null 不是值 是类型 故可以重复添加


在建表的时候,单独的用unique(字段) 来设置字段的约束

create table tb5(
	tname  varchar(10),
	tage int, 
	unique(tname,tage) -- 联合唯一约束 表级约束
);

联合约束,表示两个或以上的字段同时与另一条记录相等,则报错


表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)

create table tb6(
	tname  varchar(10),
	tage int, 
	constraint name_age_unique unique(tname,tage) -- 联合唯一约束 表级约束
);

 constraint是约束关键字,name_age_unique自己取的名字

未修改的名字:

6. 主键约束(primary key)PK

        主键(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录

        表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值

主键约束与“not null unique”区别

  • 作为Primary Key的域/域组不能为null,而Unique Key可以。
  • 在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。unique not null 可以 将表的一列或多列定义为唯一性属性,而primary key设为多列时,仅能保证多列之和是唯一的, 具体到某一列可能会重复。
  • 更大的区别在逻辑设计上。Primary Key一般在逻辑设计中用作记录标识,这也是设置 Primary Key的本来用意,而Unique Key只是为了保证域/域组的唯一性。

一张表应该有主键字段,如果没有,表示该表无效

主键值:是当前行数据的唯一标识、是当前行数据的身份证号

即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录

create table tb7(
	tid int primary key,
	tname  varchar(10),
	tage int 
);

create table tb8(
	tid int primary key, -- 标识
	tname  varchar(10) not null unique, -- 不能没有值,不能重复
	tage int 
);

-- B+tree 必须要有一个主键,树结构就是用主键构建的
-- 主键用来构建InnoDB引擎结构,只能有且只有一个

复合主键(表级定义)

在定义列名的时候设置主键

create table tb9(
	tid int,
	tname  varchar(10), 
	tage int,
	primary key(tid,tname,tage)
);

在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动 生成,自增数从1开始,以1递增(auto_increment)

-- 自增数值类型的主键,简单性,可用性(int bigint)
create table tb10(
	tid int primary key auto_increment,
	tname  varchar(10), 
	tage int
);
  1. 一个表最多只能有一个自增长列
  2. 当需要产生唯一标识符或顺序值时,可设置自增长
  3. 自增长列约束的列必须是键列(主键列,唯一键列)
  4. 自增约束的列的数据类型必须是整数类型
  5. 如果自增列指定了o和 null,会在当前最大值的基础上自增:如果自增列手动指定了具体值,直接赋值为具体值 

分类

按主键约束的字段数量分类

        无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好 几个字段

  • 单一主键:给一个字段添加主键约束
  • 复合主键:给多个字段联合添加一个主键约束(只能用表级定义)

  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
  • 主键约束对应着表中的一列或者多列(复合主键)
  • 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
  • MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
  • 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
  • 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。

7. 外键约束(foreign key)FK

        外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。 若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键

A为基本表或父标,主表,B为信息表,子表,副表

  只能是表级定义 foreign key(表的字段名) references 父表表名(父表的字段名)

某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值

-- 外键
create table A(
	aid int primary key auto_increment,
	aname varchar(10)
);

drop table B;
create table B(
	bid int primary key auto_increment,
	bname varchar(10),
	aid int,
	foreign key(aid) references a(aid)
);

阿里巴巴规范

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

说明:以学生和成绩的关系为例,学生表中的student_id是主键,那么成绩表中的student_id 则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,即为 级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻 塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

分类

按外键约束的字段数量分类

  • 单一外键:给一个字段添加外键约束
  • 复合外键:给多个字段联合添加一个外键约束

注意:

一张表可以有多个外键字段(与主键不同)

外键值可以为null

外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束

有了外键引用之后,表分为父表和子表

                        班级表:父表

                        学生表:子表

创建先创建父表

删除先删除子表数据

插入先插入父表数据

8. 约束的添加和删除

添加 

添加非空约束
alter table  表名  modify test_student char(10) not  null; 
添加唯一约束
alter table 表名 add unique(表字段名,字段,字段,字段);
添加主键约束
alter table 表名 add primary key(表的字段名,字段,字段);
添加外键约束
alter table 表名 add constraint N1 foreign key (表字段名) references 父表(父表字段名);

删除

删除not null约束
alter table 表名 modify 列名 类型;
删除unique约束
alter table 表名 drop index 唯一约束名;
删除primary key约束
alter table 表名 drop primary key;
删除foreign key约束
alter table 表名 drop foreign key 外键名;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM内存模型剖析与参数设置

目录 Java语言的跨平台特性 JVM 的主要组成部分及其作用是什么? JVM整体结构及内存模型 线程栈&#xff08;Machine Stack&#xff09; 局部变量表&#xff08;Local Variable Table&#xff09; 操作数栈&#xff08;Operand Stack&#xff09; 程序计数器&#xff08…

【Linux】已解决:Ubuntu虚拟机安装Java/JDK

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项结论 已解决&#xff1a;Ubuntu虚拟机安装Java/JDK 一、分析问题背景 在Ubuntu虚拟机上安装Java开发工具包&#xff08;JDK&#xff09;是许多开发者的常见任务。然而&#xff0c;在…

Pc端多功能视频混剪工具/便携版打开即用

PC便携版 视频批量剪辑大师&#xff0c;全自动剪辑神器&#xff0c;会打字就能做视频 多功能&#xff0c;视频混剪&#xff0c;视频配音&#xff0c;文字生成语音&#xff0c;图片合成视频&#xff0c;自动识别音频并生成字幕等功能 链接&#xff1a;https://pan.baidu.com/…

2007-2022年 省级-绿色农业合作社数量相关数据整理

绿色农业合作社作为一种推动农业可持续发展的组织形式&#xff0c;对于促进环境保护、提高农产品质量和增加农民收入等方面具有重要作用。以下是对省级绿色农业合作社数量相关数据的介绍&#xff1a; 数据简介 定义&#xff1a;绿色农业合作社是由农民、农业专家、企业家等组…

详细解释Redis的SET NX命令

详细解释Redis的SET NX命令 SET NX 命令是 Redis 中用于实现分布式锁的一个重要命令。它的语法和用法如下&#xff1a; SET key value NX [EX seconds | PX milliseconds]参数解释 key&#xff1a;要设置的键名。value&#xff1a;要设置的键值&#xff0c;通常用一个唯一标…

【小沐学AI】Python实现语音识别(whisper+HuggingFace)

文章目录 1、简介1.1 whisper 2、HuggingFace2.1 安装transformers2.2 Pipeline 简介2.3 Tasks 简介2.3.1 sentiment-analysis2.3.2 zero-shot-classification2.3.3 text-generation2.3.4 fill-mask2.3.5 ner2.3.6 question-answering2.3.7 summarization2.3.8 translation 3、…

SM2258XT量产工具,SM2258XT开卡三星SSV4颗粒成功分享,SM2259XT量产参考教程,威刚ADATA SP580开卡记录

前两天拆了笔记本上的威刚ADATA SP580 240GB&#xff0c;准备做移动硬盘用&#xff0c;装入移动硬盘盒之后接入电脑&#xff0c;发现系统可认盘&#xff0c;SMART显示正常&#xff0c;Windows的磁盘管理能显示正确容量&#xff0c;但处于未初始化状态&#xff0c;且始终无法初始…

鸿蒙系统——强大的分布式系统

鸿蒙相比较于传统安卓最最最主要的优势是微内核分布式操作系统&#xff0c;具有面向未来&#xff0c;跨设备无缝协作&#xff0c;数据共享的全场景体验。下面简单来感受一下鸿蒙系统的多端自由流转。 自由流转概述 场景介绍 随着全场景多设备的生活方式不断深入&#xff0c;…

SSM网上旅游信息管理系统-计算机毕业设计源码06975

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

计算神经网络中梯度的核心机制 - 反向传播(backpropagation)算法(1)

计算神经网络中梯度的核心机制 - 反向传播&#xff08;backpropagation&#xff09;算法&#xff08;1&#xff09; flyfish 链式法则在深度学习中的主要应用是在反向传播&#xff08;backpropagation&#xff09;算法中。 从简单的开始 &#xff0c;文本说的就是链式法则 R …

酒店客房管理系统(Java+MySQL)

技术栈 Java: 作为主要编程语言。Swing GUI: 用于开发图形用户界面。MySQL: 作为数据库管理系统。JDBC: 用于连接和操作MySQL数据库。 功能要点 管理登录认证 系统提供管理员登录认证功能。通过用户名和密码验证身份&#xff0c;确保只有授权的用户可以访问和管理酒店客房信…

如何利用react框架快速创建一个electron项目

1、搭建electron项目 创建一个electron入门项目还是很容易的&#xff0c;基体方法可以参考&#xff1a;eletron入门教程 -- 快速写一个electron demo程序 但是如果要利用react框架搭建一个electron项目&#xff0c;但是有一点麻烦&#xff0c;不过可以利用工具包来进行创建&am…

opengl 实现反锯齿

// 启用混合 //glEnable(GL_BLEND); // 设置混合函数 //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glEnable(GL_POINT_SMOOTH); // 启用点平滑 //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // 选择最佳点平滑 glEnable(GL_BLEND); glBlendFu…

这四款软件很好用,可以提升工作、学习效率

TableConvert TableConvert是一个基于Web的在线表格转换工具&#xff0c;能够将多种格式的表格数据进行快速转换。它支持将Excel、URL、HTML、JSON、CSV等格式转换为Markdown表、CSV/TSV、XML、YAML、插入SQL、HTML、Excel和LaTeX等格式。用户只需将表格数据粘贴到编辑器&#…

pikachu靶场 利用Rce上传一句话木马案例(工具:中国蚁剑)

目录 一、准备靶场&#xff0c;进入RCE 二、测试写入文件 三、使用中国蚁剑 一、准备靶场&#xff0c;进入RCE 我这里用的是pikachu 打开pikachu靶场&#xff0c;选择 RCE > exec "ping" 测试是否存在 Rce 漏洞 因为我们猜测在这个 ping 功能是直接调用系统…

驱动开发:配置Visual Studio驱动开发环境

100编程书屋_孔夫子旧书网 配置驱动开发环境配置驱动开发模板配置驱动双机调试 在正式开始驱动开发之前&#xff0c;需要自行搭建驱动开发的必要环境&#xff0c;首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具&#xff0c;在课件内请双击ISO文件并运行内部的…

【单片机毕业设计选题24038】-基于STM32的木材厂环境监测系统

系统功能: 系统上电后根据采集到的传感器值自动控制&#xff0c;温度过高后自动开启风扇通风降温&#xff0c;湿度过 高后自动开启风扇除湿&#xff0c;光照过低后自动开启补光&#xff0c;雨量过高蜂鸣器报警&#xff0c;火焰传感器检 测到火灾后蜂鸣器报警并打开水泵灭火。…

(漏洞检查项) | 任意文件包含漏洞 file-include

(漏洞检查项)|任意文件包含漏洞 file-include 漏洞场景 1.含有动态包含语句 2.有类似于文件读取的url 漏洞描述 攻击者可以利用任意文件包含漏洞&#xff0c;读取任意文件&#xff0c;对服务器造成危害。 程序开发人员为了代码的灵活性&#xff0c;常常会将包含文件的路径…

c++重载(运算符)

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 对于系统的所有操作符&#xff0c;一般情况下&#xff0c;只支持基本数…

算法:链表

目录 链表的技巧和操作总结 常用技巧&#xff1a; 链表中的常用操作 题目一&#xff1a;反转一个单链表 题目二&#xff1a;链表的中间结点 题目三&#xff1a;返回倒数第k个结点 题目四&#xff1a;合并两个有序链表 题目五&#xff1a;移除链表元素 题目六&#xff…