Mysql02---插表的各种操作

Intro

  批量写入mysql的两种情形:

  • 存在则删除,再全量写入
  • 存在则忽略,不存在则写入
  • 存在则更新,不存在则写入

分别看下

数据准备

用python操作下,方便看操作之后结果。

建表:

CREATE TABLE `student` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`stu_id` bigint(20)  NOT NULL  COMMENT '学号',
`name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名',
`sex` varchar(32) NOT NULL DEFAULT '' COMMENT '性别',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_stu_id_` (`stu_id`,`name`) USING BTREE
) 
  • 自增主键id
  • 唯一约束,表中不会出现重复的stu_id和name
import pymysql
import pandas as pd
# 打开数据库连接
db_conn = pymysql.connect(host='localhost',
                     user='root',
                     password='12345',
                     database='test')
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db_conn.cursor()
create_sql = """
CREATE TABLE `student` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`stu_id` bigint(20)  NOT NULL  COMMENT '学号',
`name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名',
`sex` varchar(32) NOT NULL DEFAULT '' COMMENT '性别',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_stu_id_` (`stu_id`,`name`) USING BTREE
) 
"""
cursor.execute(create_sql)
db.commit()
pd.read_sql("desc student",db_conn)
FieldTypeNullKeyDefaultExtra
0idbigint unsignedNOPRINoneauto_increment
1stu_idbigintNOMULNone
2namevarchar(32)NO
3sexvarchar(32)NO
4create_timetimestampNOCURRENT_TIMESTAMPDEFAULT_GENERATED
5update_timetimestampNOCURRENT_TIMESTAMPDEFAULT_GENERATED

写入测试数据

query_sql = "SELECT * FROM student"
insert_sql = """
INSERT INTO student ( stu_id, name,sex )
VALUES ( 101, '小明','男')
       ,( 102, '小红','女');
"""
cursor.execute(insert_sql)
db.commit()
pd.read_sql(query_sql,db_conn)
idstu_idnamesexcreate_timeupdate_time
01101小明2021-11-16 11:19:482021-11-16 11:19:48
12102小红2021-11-16 11:19:482021-11-16 11:19:48

存在则删除,再重新写入

表中已有的数据,先删除再重新写入。判断数据重复的逻辑,根据PRIMARY KEY和UNIQUE KEY

insert_sql = """
REPLACE INTO student (id, stu_id, name,sex )
VALUES (1, 103, '小明','男')
"""
cursor.execute(insert_sql)
db.commit()
pd.read_sql(query_sql,db_conn)
idstu_idnamesexcreate_timeupdate_time
01103小明2021-11-16 11:24:412021-11-16 11:24:41
12102小红2021-11-16 11:19:482021-11-16 11:19:48

如上所示,id重复的1,原始数据被删除,后写入新数据
再看,UNIQUE KEY重复的情况

insert_sql = """
REPLACE INTO student ( stu_id, name,sex )
VALUES (103, '小明','南上加南')
"""
cursor.execute(insert_sql)
db.commit()
pd.read_sql(query_sql,db_conn)
idstu_idnamesexcreate_timeupdate_time
02102小红2021-11-16 11:19:482021-11-16 11:19:48
13103小明南上加南2021-11-16 11:25:552021-11-16 11:25:55

UNIQUE KEY(stu_id+name)有重复,把id=1数据删除,重新写入一条数据,且id自增为3

存在则忽略,反之写入

insert_sql = """
INSERT IGNORE INTO student ( stu_id, name,sex )
VALUES (103, '小明','南上加南')
       ,(104, '小静','女');
"""
cursor.execute(insert_sql)
db.commit()
pd.read_sql(query_sql, db_conn)
idstu_idnamesexcreate_timeupdate_time
02102小红2021-11-16 11:19:482021-11-16 11:19:48
13103小明南上加南2021-11-16 11:25:552021-11-16 11:25:55
24104小静2021-11-16 11:30:212021-11-16 11:30:21

103已经存在,直接忽略,写入104这条数据

存在则更新,反之则写入

insert_sql = """
INSERT  INTO student ( stu_id, name,sex )
VALUES ( 103, '小明','男')
       ,( 105, '小花','猫')
ON DUPLICATE KEY 
UPDATE name=VALUES(name)
       ,sex=VALUES(sex)
       ,update_time=VALUES(update_time)
"""
cursor.execute(insert_sql)
db.commit()
pd.read_sql(query_sql, db_conn)
idstu_idnamesexcreate_timeupdate_time
02102小红2021-11-16 11:19:482021-11-16 11:19:48
13103小明2021-11-16 11:25:552021-11-16 11:36:03
24104小静2021-11-16 11:30:212021-11-16 11:30:21
36105小花2021-11-16 11:36:032021-11-16 11:36:03
  • stu_id=103,sex字段被更新,update_time字段被更新
  • stu_id=105,非重复数据,直接insert
  • id=5这个索引被用掉了,虽然没有生成数据,原理不太了解,记录下
db.close()

Ref

[1] https://www.cnblogs.com/-wenli/p/13328559.html
[2]https://blog.csdn.net/t894690230/article/details/77996355

                                2021-11-16 于南京市江宁区九龙湖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值