mysql中用表A的数据更新表B

此次要实现以下目的:把表A中的数据复制到表B,对于表B已有的数据不进行更新。

基本原理:在 INSERT 语句后面用 ON DUPLICATE KEY UPDATE

1. 设置目标表B的主键或唯一索引,以便于SQL插入数据时判断是否重复。 这里设置的是ts_code\trade_date的联合索引,类型unique。

2.insert into tableb select * from tablea ORDER BY ts_code,trade_date 
  ON DUPLICATE KEY UPDATE close=VALUES(close);
这里用order by,默认是升序,对数据排好序再插入目标表。

这样就可以了。

这句执行完会返回一个“影响行数”Affected rows,这个值的算法是,每一条数据若保留原值算0、插入算1、更新算2,所有行该值的总和。例如更新了7条插入2条,值为14+2=16。

其他方法:

查询两个表的去重数据,做为新表
select * into 新表名 from (select * from tableb union select * from tablea) 

再把旧表删除,新表改为旧表的名就好了。

单个表的数据去重:

CREATE TABLE tmp SELECT * FROM tableb GROUP BY (ts_code,trade_date);
DROP TABLE tableb ;
ALTER TABLE tmp RENAME TO tableb ;

附加说明:

change是mysql保留的关键字,如果用它作为字段名时,要用`change`,这个符号是数字行最左边那个,不是单引号。如 SELECT date,`change` FROM tableb

python的DataFrame.to_sql()语句,其原理是执行 insert into tableb (列名,…) values (%s %s…) parameters:( (20180625,'388888.SZ',…),(…),…)

但以下这样把所有字段名都写进去的代码是错误的:
INSERT INTO tableb
(ts_code,trade_date,open,high,low,close,pre_close,`change`,pct_chg,vol,amount) VALUES 
(SELECT ts_code,trade_date,open,high,low,close,pre_close,`change`,pct_chg,vol,amount FROM tablea ) 
ON DUPLICATE KEY UPDATE trade_date=VALUES(trade_date);

其他SQL语句:
if exists(select 1 from T where T.a='1001' ) update T set T.b=2 Where T.a='1001' else insert into T(a,b) values('1001',2); #条件判断,如果存在则更新,不存在则插入
#SHOW DATABASES #数据库名
#SHOW TABLES #[FROM db_name] #列出数据库中的表
#SHOW TABLE STATUS #[FROM db_name]#列出数据库的表详细信息,这里的行数不准。
#SHOW COLUMNS FROM stock_dateori #[FROM db_name]#列出表的列信息
#SHOW FULL COLUMNS FROM stock_dateori # [FROM db_name] #更详细点的列出表的列信息
#SHOW FIELDS FROM stock_dateori #[FROM db_name] #表的列信息 FIELDS基本同columns
#DESCRIBE stock_dateori #[col_name] #表的列信息
#SHOW INDEX FROM stock_dateori #[FROM db_name]︰列出表的索引信息。
# 索引描述: Collation,以什么方式存储在索引中,可以是A或NULL,B+树索引是A,即排序的。
#     cardinality 索引中唯一值的数目的估计值,它除以表的行数应尽可能接近1,如果太小可以删除该索引。
#     Index_type  innodb存储引擎只支持B+树索引,这里都是BTREE。
#SHOW STATUS #列出Server的状态信息。
#SHOW VARIABLES #列出 MySQL 系統参数值
#SHOW PROCESSLIST #查看当前mysql查询进程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值