mysql学习(列属性)

##主键##
主键:primary key,用来唯一约束该字段里的数据,不能重复。一张表中最多只能有一个主键。

###增加主键###
在sql中,有下面几种方式增加主键:

  • 在创建表的时候,直接在字段之后跟上primary key关键字,主键默认不能为空
-- 增加主键
create table my_primary1(
	number char(10) primary key comment '学好',
	name varchar(20) not null comment '姓名'
)charset utf8;

这里写图片描述

 - 在创建表的时候, 在所有的字段之后使用primary key(主键字段列表)来创建主键(可以是复合主键).
-- 创建复合主键
create table my_primary2(
	number char(10) comment '学号',
	course char(10) comment '课程',
	score tinyint unsigned default 60 comment '成绩',
	primary key(number,course)
)charset utf8;

这里写图片描述

  • 当表已经创建好之后,再次额外增加主键,可以通过修改表字段属性,也可以直接追加。
alter table 表名 add primary key(字段列表);

-- 创建my_primary3表格
create table my_primary3(
	number char(10) comment '学号',
	course char(10) comment '课程'
)charset utf8;

-- 额外添加主键
alter table my_primary3 add primary key(number,course);

这里写图片描述
可以看到,这里首先创建了一张表格,然后通过添加主键的方式来设置主键。

###主键约束###
主键对应的字段中的数据,不允许重复,一旦出现重复,数据操作失败。
###删除主键###

alter table 表名 drop primary key;

这里写图片描述

##自动增长##
自动增长:auto increment,自增长有如下特点:

  • 任何一个字段要做自增长,前提是该字段本身必须是一个索引(key有值)
  • 自增长必须是数字(整型)
  • 一张表最多只能有一个自增长
-- 自增长
create table my_auto(
	id int auto_increment comment '自动增长',
	name varchar(20)
)charset utf8;

这里写图片描述
可以看到,这里提示"自增长的类型必须是索引"。这里我们将其改为主键

-- 自增长
create table my_auto(
	id int primary key auto_increment comment '自动增长',
	name varchar(20)
)charset utf8;

这里写图片描述
###修改自增长###
自增长,如果涉及到字段改变,必须先删除自增长,后增加自增长(因为一张表里,只允许存在一个自增长)

  • 修改当前自增长的最大值
alter table 表名 auto_increment = 值

-- 修改自增长的值
alter table my_auto auto_increment=5;

这里写图片描述

  • 查看自增长变量
-- 查看自增长变量
show variables like 'auto_increment%'

这里写图片描述
可以修改变量实现不同的增长效果

-- 设置每次自增5
set auto_increment_increment=5;

这里写图片描述

###删除自增长###
自增长是字段的一个属性,可以通过modify来修改

alter table 表名 modify 字段 类型; 

-- 删除自增长
alter table my_auto modify id int;

这里写图片描述

##唯一键##
在一张表中,往往有很多字段不能重复,但是一张表中只能够有一个主键,此时可以使用唯一键(unique)来解决字段唯一性约束的问题。

  • 唯一键,允许字段为空
    ###增加唯一键###
  • 在创建表的时候,在字段后面直接跟上unique
-- 直接增加唯一键
create table my_unique(
	number varchar(10) unique comment '学号',
	name varchar(20) not null
)charset utf8;

这里写图片描述

  • 在字段后面添加unique key(字段列表)
create table my_unique2(
	number int comment '学号',
	name varchar(20),
	unique key(number)
)charset utf8;

这里写图片描述

  • 在创建表之后,增加唯一键
create table my_unique3(
	number int not null,
	name varchar(20)
)charset utf8;

-- 在创建表之后,增加唯一键
alter table my_unique3 add unique key(number);

这里写图片描述

###更新唯一键###

  • 删除唯一键
-- 删除唯一键
alter table 表名 drop index 索引名字  -- 唯一键默认使用字段名称作为索引名称

alter table my_unique3 drop index number;

这里写图片描述

##索引##
索引:系统根据某种算法,将已有的数据,单独建立一个文件,能够实现快速的匹配数据,并且能够快速的找到对应表中的记录。

  • 提升查询效率
  • 约束数据的有效性
    如果某一个字段,需要作为查询的条件经常使用,那么可以使用索引。

mysql中提供了多种索引,如下:

  • 主键索引: primary key
  • 唯一索引: unique key
  • 全文索引: fulltext index(针对文章内部的关键字,进行索引)
  • 普通索引: index
    ##关系##
    将实体与实体的关系,反映到最终数据库表的设计上来,分三种:一对一,一对多,多对多。
    ###一对一###
    一对一:一张表中的一条记录,只能与另外一张表中的一条记录进行对应。

学生表:姓名,性别,年龄,身高,体重,籍贯,住址
|id| 姓名 | 性别 | 年龄 |住址 | 身高 | 体重 |籍贯 |
| ------------- |:-------------? -----?
| | | |

以上表格中,姓名,性别,年龄,住址是常用的数据,但是身高,体重,籍贯是不常用的数据,如果每次都查询所有数据,不常用的数据就会影响查询效率,此时可以使用一对一来设计该表格。

  • 常用数据
    |id| 姓名 | 性别 | 年龄 |住址 |
    | ------------- |:-------------? -----?
    | | | |
  • 不常用数据
    |id| 身高 | 体重 |籍贯 |
    | ------------- |:-------------? -----?
    | | | |

可以看到这里的都是一样的,可以根据当前的id去不常用的表格中查找对应的数据。

###一对多###
一对多:一张表中的一条记录,可以对应另外一张表的多条记录,但是反过来,另一张表的一条记录,只能对应第一张表的一条记录。
妈妈与孩子:

  • 妈妈表:
    |mother_id| 姓名| 年龄| 身高 |
    | ------------- |:-------------? -----?
    | | | |

  • 孩子表:
    |child_id| 姓名| 年龄| 性别| mother_id
    | ------------- |:-------------? -----?
    | | | |

一个妈妈可以对应一个或者多个孩子,但是一个孩子只能够对应一个妈妈。上面的表的设计,在孩子表中,增加了一个mother_id字段指向妈妈表中的一条记录。

###多对多###
多对多:一张表(A表)中的一条记录,可以对应另外一张表(B表)的多条记录,同时(B表)的一条记录也能够对应(A表)的多条记录。

老师和学生:

  • 老师表

|teacher_id| 姓名| 年龄| 性别|
| ------------- |:-------------? -----?
| | | |

学生表
|student_id| 姓名| 年龄| 性别|
| ------------- |:-------------? -----?
| | | |

老师_学生表:
学生表

student_idteacher_id

##主键冲突##
当进行插入操作时候,此时如果需要插入的记录的主键在表中的记录已经存在,即主键冲突,此时可以选择性的进行处理,更新和替换。
###更新操作###

insert into 表名 (字段列表,需要包含主键) values(值列表) on duplicate key update 字段=新值

这里写图片描述

-- 插入数据
insert into my_student (studentid,number,name) values(1,'001','shangsan');

-- 插入主键为1的数据
insert into my_student (studentid,number,name) values(1,'001','lisi');

-- 主键冲突:更新
insert into my_student values(1,'001','testname') on duplicate key update name='testname';

这里写图片描述

这里写图片描述
可以看到,上面这种通过更新的方法是可以解决该问题,但是如果需要更新的字段非常的多的话,就需要书写好多的字段。

###替换操作###

replace into 表名 (字段列表:需要包含主键) values(值列表)

-- 主键冲突:替换
replace into my_student values(2,'002','facebook');

这里写图片描述

##蠕虫复制##
蠕虫复制:从已有数据中获取数据,然后将数据又进行新增操作(先查出数据,然后将查出的数据新增一遍).

  • 表创建高级操作:
    从已有表创建新表(复制表结构)
create table 表名 like 数据库.表名

insert into 表名(字段列表) select 字段列表/* from 表名;

这里写图片描述

欢 迎 关 注 我 的 公 众 号 “编 程 大 全”

专注技术分享,包括Java,python,AI人工智能,Android分享,不定期更新学习视频
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值