sql中使用timestamp增量抽取数据
网址:http://www.cnblogs.com/shuaifei/p/4469526.html
最近的项目中需要对上百万级的数据进行增量抽取操作,因此了解了一下TIMESTAMP的应用,特此记录
timestamp -- 时间戳:数据库中自动生成的唯一二进制数字,与时间和日期无关的, 通常用作给表行加版本戳的机制。存储大小为 8个字节
每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。该计数器是数据库时间戳。这 可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。一个表只能有一个 timestamp 列。每次修改或插入包含 timestamp 列的行 时,就会在 timestamp 列中插入增量数据库时间戳值。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。对行的任 何更新都会更改 timestamp 值,从而更改键值。如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。如果该表在动态游标 中引用,则所有更新均会更改游标中行的位置。如果该列属于索引键,则对数据行的所有更新还将导致索引更新。
使用某一行中的 timestamp 列可以很容易地确定该行中的任何值自上次读取以后是否发生了更改。如果对行进行了更改,就会更新该时间戳值。如果没有对行进行更改,则该时间戳值将与以前读取该行时的时间戳值一致。
使用记录:
现有源表tmp_a和目标表tmp_b,需要每天都将tmp_a中的修改的数据同步到tmp_b中
1
2
3
4
5
6
7
|
--创建源表tmp_a create table tmp_a(a varchar (10),b TIMESTAMP ) insert into tmp_a(a) values ( 'abc' ) insert into tmp_a(a) values ( '123' ) --创建目标表tmp_b create table tmp_b(a varchar (10),b TIMESTAMP ) |
查询tmp_a和tmp_b数据
1
2
3
|
--查询tmp_a SELECT * FROM tmp_a SELECT * FROM tmp_b |
结果,最大的值为 0x00000000000084FD
将tmp_a的数据到如tmp_b中
1
2
3
|
--导入表tmp_b INSERT INTO tmp_b (a,b) SELECT a,b FROM tmp_a |
执行后会发现会报错误:
消息 273,级别 16,状态 1,第 2 行
不能将显式值插入时间戳列。请对列列表使用 INSERT 来排除时间戳列,或将 DEFAULT 插入时间戳列。
查询资料后得知:timestamp这个值一般都是数据库自动添加和修改的,相当于自动增长标识一样(而且执行update修改语句这个字段也会自动更新),所以一般这个字段我们只做查询操作。如果要更新这个字段则会提示这个错误信息:不能更新时间戳列。但是这个字段是可以手动添加的,不过也只能使用DEFALUT字段(default字段为SQL Service数据库的一个默认值),如果传入其他值则会提示错误信息:不能将显式值插入时间戳列。请对列列表使用 INSERT 来排除时间戳列,或将 DEFAULT 插入时间戳列
因此需要将timestamp数据进行转化
修改tmp_b的结构为:
1
2
|
--创建目标表tmp_b create table tmp_b(a varchar (10),b VARBINARY(8)) |
然后将tmp_a中列b的值转化为 十六进制字符串
1
2
3
|
--导入表tmp_b INSERT INTO tmp_b (a,b) SELECT a, CAST (b AS VARBINARY(8)) FROM tmp_a |
执行成功,这样tmp_a和tmp_b数据相同
修改tmp_a中的数据,会发现tmp_a中的列值为‘abc’的列b已修改
1
2
3
4
5
6
7
8
9
|
UPDATE tmp_a SET a= 'def' WHERE a= 'abc' SELECT * FROM tmp_a --结果 a b def 0x0000000000008502 123 0x0000000000008501 |
对比两个表的数据,不同的b列数据,则进行更新操作
1
|
SELECT * FROM tmp_a ta WHERE ta.b>0x00000000000084FD |
sql中使用timestamp增量抽取数据的更多相关文章
- 数据仓库系列之ETL中常见的增量抽取方式
为了实现数据仓库中的更加高效的数据处理,今天和小黎子一起来探讨ETL系统中的增量抽取方式.增量抽取是数据仓库ETL(数据的抽取(extraction).转换(transformation)和装载(lo ...
- sql中对查询出来的数据进行分页
当sql中存储的数据量比较大时,在web中 数据显示时都会对数据进行分页,分页不会在客户端进行分页,而是在数据库查询过程中进行了分页. sql代码: DECLARE @pageindex INT; - ...
- kettle 6.1 按时间循环增量抽取数据
场景:假设有一张表数据量很大,需要按一个时间来循环增量抽取 方法:主要是通过JOB自身调用,实现循环调用,类似于 函数自调用 的循环. 1.JOB全图: 2.获取增量时间,并设置增量时间环境变量 3. ...
- SQL中的float类型的数据
问题1. 如何在SQL中默认的使用float类型的数据 SQL中想要通过计算的方式最快的得到一个float类型的数据,只需要运算的其中一个值后面加上小数点就ok. 比如 :9/2=4 但是 :9/2 ...
- SQL中CRUD C——create 添加数据 R——read 读取数据 U——update 修改数据 D——delete 删除数据
在SQL server中对数据库的操作: 删除表:drop table 表名修改表:alter table 表名 添加列add 列名 列类型alter table 表名 drop column 列名 ...
- sql中如何获取一条数据中所有字段的名称和值
declare ) ) --获取表的列名 ,),filename INTO #templist FROM (select cl.name as filename from sys.tables AS ...
- [SQL]SQL中把一个字段的数据分多行显示
其实你完全可以写个自定义函数就OK了 . =================================================================== create func ...
- SQL中获取排序分组后数据的脚本
废话不多说了,先上一段代码,如下所示: select distinct b.OrgID,b.CompanyID,b.AreaID,b.CustChannelID,b.CustID,b.SaleTo ...
- 记录sql中统计近五天数据的口径(While+IF)
话不多说,直接上码↓ IF OBJECT_ID('tempdb..#Table') IS NOT NULL BEGIN DROP TABLE #Table; END; DECLARE @tbRange ...
随机推荐
- android Gallery2 onPause时候,其背景界面显示黑色
改动: Src/com/android/gallery3d/app/AbstracGalleryActivity.java OnResume()函数约290行 去掉 mGLRootView.setVi ...
- iscroll的理解
1. 最佳的HTML结构如下: <div id="wrapper"> <ul> <li>...</li> <li>... ...
- refresh的停车场(栈和队列的STL)
refresh的停车场 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 refresh近期发了一笔横財,开了一家停车场. 因 ...
- 本地filezilla&servervsftp搭配使用
环境:本地ubuntu系统&serverubuntu系统 本地安装filezilla apt-get install filezilla '安装filezilla filezilla '执行 ...
- Java各类格式转换
1.Java 根据固定格式的Excel生成实体类 2.GPS 经纬度转换为 经过旋转后的平面坐标
- eclipse maven 刷新报错
问题描述: An internal error occurred during: "Loading descriptor for cmbc_wms.".java.lang.Null ...
- 新装上线 年度精品 XP,32/64位Win7,32/64位Win10系统【电脑城版】
随着Windows 10Build 10074 Insider Preview版发布,有理由相信,Win10离最终RTM阶段已经不远了.看来稍早前传闻的合作伙伴透露微软将在7月底正式发布Win10的消 ...
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
- c#数组的count()和length的区别
C# 数组中 Length 表示数组项的个数,是个属性. 而 Count() 也是表示项的个数,是个方法,它的值和 Length 一样.但实际上严格地说 Count() 不是数组的内容,而是 IEnu ...
- varnish代理缓存服务器的安装与使用
1. 下载解压 cd /usr/local/src/ wget https://codeload.github.com/varnishcache/varnish-cache/zip/master ch ...