当前位置:首页 » 编程语言 » 数据校验的sql
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

数据校验的sql

发布时间: 2023-01-11 12:23:16

㈠ oracle表内表间数据校验是什么意思是sql中的约束吗

表内数据检验一般用 check,也可能用trigger,特殊情况下用外键,比如部门表 的部门与父部门的关系。

表间数据检验用 外键 来实现

㈡ 如何验证SQL的select是否有返回值

几种方式:
1.单一的select语句:select count(1) from dba_users where username = '用户名';
通过count的值是否为0来判断是否有这个用户

2.存储过程中通过异常来判断
begin
select username into lv_username from dba_users where username = '用户名';
exception no_data_found then
-- 没有找到就可以新建用户

end;
这两种方式是我觉得比较简单的了。希望能够对你有帮助。

㈢ 如何利用MySQL数据库查看和设置SQL模式

在MySQL数据库,SQL模式可以用来解决不同严格程度的数据校验,在不同数据库进行数据迁移时,可以达到迁移的目的。下面利用实例来说明SQL模式方法,具体操作如下:
http://jingyan..com/article/ce43664922bd1f3772afd373.html

㈣ sql server如何验证两个表中数据完全相同 ,

您好,假设A表有列a,b,B表有列a,b,year。
语句如下:
select count(*) from A t1,B t2 where t1.a=t2.a and t1.b=t2.b获得两个表相同数据的数据量,假设结果是c1
select count(*) from A 获得A表数据量,假设加过是c2
select count(*) from B 获得B表数据量,假设结果是c3
在此,如果c1=c2=c3,则A,B两个表的数据量相同,且数据相同。

望采纳,希望对你有帮助

㈤ 如何使用检查约束验证SQL Server中的数据

约束可以验证单列的域完整性,也可以验证多列的域完整性,在单个列上可以有多个检查约束,如果插入或更新的数据违反了检查约束,数据 库引擎将暂时停止INSERT和UPDATE操作。 检查约束由逻辑表达式构成,逻辑表达式可能是单个表达式,如“Salary<200000.00”,也可能是多个表达式,如“RentalDateGETDATE ()andRentalDate 中的数据,检查约束是基于列的,因此,即便表中某列的检查约束没有通过,也不会影响到表中其它列的INSERT和UPDATE操作,检查约束可以在列级创建,也可以在表级创建。

㈥ 如何在SQL运行速达软件中的“数据校验”和“数据重组”

这个不难,通过SQL的跟踪就可以查到相关的语句和命令。有了语句和命令,就可以了。

㈦ sql 语句 验证身份证号码

帮你搜了一下,参考参考。

主要验证SQL数据库中已输入的15位 及18位 身份证号码的位数、出生年月日是否正确,
可以过滤出大部分的输入错误。

or (len(身份证号)=18 and (Substring(身份证号,7,2)<'19' or Substring(身份证号,7,2)>'20'
or (Substring(身份证号,11,2)>12)
or (Substring(身份证号,11,2) in (01,03,05,07,08,10,12) and Substring(身份证号,13,2)>31)
or (Substring(身份证号,11,2) in (04,06,09,11) and Substring(身份证号,13,2)>30)
or (Substring(身份证号,11,2)=02 and Substring(身份证号,13,2)>29)))
---------------------- 下面是针对 15位 及18位 身份证号码性别的验证语句 ------------------

-- Access 不支持 Substring 查询,可以替换为 mid 查询。
select 序号,姓名,身份证号,性别
from 身份表
where (((len(身份证号)=15) and (Substring(身份证号,15,1) in (1,3,5,7,9)) and 性别<>'男')
or ((len(身份证号)=15) and (Substring(身份证号,15,1) in (2,4,6,8,0)) and 性别<>'女'))
or (((len(身份证号)=18) and (Substring(身份证号,17,1) in (1,3,5,7,9)) and 性别<>'男')
or ((len(身份证号)=18) and (Substring(身份证号,17,1) in (2,4,6,8,0)) and 性别<>'女'))

---------------------- 下面是针对 15位 及18位 身份证号码位数与出生年月日的验证 ------------------

-- Access 不支持 Substring 查询,可以替换为 mid 查询。

select 序号,姓名,身份证号,性别
from 身份表
where (len(身份证号)<>15 and len(身份证号)<>18)
or (len(身份证号)=15 and ((Substring(身份证号,9,2)>12)
or (Substring(身份证号,11,2) > 31)
or (Substring(身份证号,9,2) in (01,03,05,07,08,10,12) and Substring(身份证号,11,2)>31)
or (Substring(身份证号,9,2) in (04,06,09,11) and Substring(身份证号,11,2)>30)
or (Substring(身份证号,9,2)=02 and Substring(身份证号,11,2)>29)))

㈧ 技术分享 | 两个单机 MySQL 该如何校验数据一致性

业务有两个 MySQL 集群是通过 MQ 进行同步的,昨晚 MQ 出现异常,报了很多主键冲突,想请 dba 帮忙校验一下两个集群的数据是否一致。

当接到这个需求的时候并没当回事,隐约有点印象 pt-table-checksum 能通过 dsn 实现 MySQL 的数据校验,所以当时就应承下来了。不曾想,啪啪打脸,回想起来真是草率了。

本文参考的是 pt-table-checksum 的校验逻辑,基于数据块去遍历每个表,然后比对 checksum 的值判断该块是否一致,本文主要是想聊聊我在实现数据校验脚本过程中遇到的问题以及解决思路,希望对大家有帮助。

利用线上的配置文件搭建一套主从环境。

这个用例将通过 dsn 方式连接从库。

这个用例将通过 dsn 方式连接从库,但是会将从库的复制链路 stop 掉,并清空复制信息。

熟悉 pt-table-checksum 的朋友应该都知道,该工具是基于主键(非空唯一键)进行扫描数据行,其实这个逻辑针对整型单列主键实现起来很简单,但是如果是联合主键且是字符型,好像就没那么简单了,有兴趣的可以思考一下。下面我先说一下大致的逻辑:

第一步:判断 _min_rowid 是否为空,为空就取该表的第一行,并记作 _min_rowid 。

第二步:根据 _min_rowid 作为条件进行扫描该表,取下一个数据块的数据,记录数据块的最后一行数据的主键值,记录 checksum 的值,并记下 _min_rowid 。

第三步:判断_min_rowid是否为空,非空重复第二步,为空退出检查。

通过上述三个步骤可以看到,如果是单列整型的主键,实现起来很简单,但是问题来了,业务的表的主键五花八门,有的是联合主键,有的是字符型的联合主键,还有整型+字符型的联合主键,那么上述的实现方式显然是有问题的。所以实现起来需要多考虑几个问题:

鉴于存在上述两个问题,可以参考如下实现逻辑:

假如有这么一个联合主键字段 primary key(a,b,c) 都是整型,该如何编写遍历 sql 呢?起初我的想法很简单,具体如下:

至此在编写校验脚本过程遇到的两个问题就算告一段落了,剩下的就是各种逻辑处理了,不过多赘述,有兴趣的可以自行阅读脚本文件。

本着最低程度影响业务,所以取消加锁逻辑。但是又要保证该数据块的数据一致性,如果这个数据块是个热数据,当前正在变更,那么校验的时候难免会不一致。所以只能通过多次校验实现,默认是校验20次,其中有一次校验结果是一致,就认为是一致的,如果前5次校验过程中,这个数据块的数据没有变化,也视为不一致(可能是因为延迟,也可能是真的不一致)。

pt-table-checksum 不校验表结构,改写时添加表结构的校验。

可以基于表的并行校验,可由用户指定并行数,但是脚本有个安全机制,如果用户指定的并行数大于当前 cpu 空闲核心数,就会按当前(空闲核心数-1)作为并行数。

添加网络监控,由用户指定网络上限百分比,当网卡流量超过这个百分比就暂停任务,等待网卡流量低于阈值才会继续任务。这个主要是出于对于中间件(mycat)的场景或者分布式数据库(tidb)的场景。

支持定时任务功能,用户可以使用这个功能规避业务高峰,仅在业务低峰进行数据校验。

不仅限于主从节点的校验,只要目标对象支持 MySQL 的标准 SQL 语法就能做数据校验。

校验逻辑是通过 SQL 采集目标节点的数据库,如果目标数据库系统当前存在异常,无疑是雪上加霜,将会触发未知问题,所以添加超时机制,单次取数据块的阈值是5s,超过5秒就放弃等待重试。测试发现,有时候即便触发超时了,但是 SQL 任务还是会在目标数据库的 processlist 中能看到,所以又添加了一个 kill 机制,超时后会触发一个 kill processlist id 的动作。另外为了避免 kill 错,在每个 SQL 对象添加了一个32位的 md5 值,每次 kill 的时候会校验这个 md5 值。

本工具借鉴 pt-table-checksum 工具思路改写,可以检查随意两个 mysql(支持 mysql sql 语法的数据库)节点的数据一致性。

基于主键以一个块遍历数据表,比对checksum的值,块的大小可通过参数指定。 (1)获取该表的第一个数据块的查询SQL。 (2)将两个目标节点的数据块的checksum的值,记录到临时文件,file1 file2。 (3)比对file1 file2是否一致。

第一步:先开启一个 screen 监控网络

第二步:新开启一个screen执行校验任务

(1)info.log 文件

(2)list目录

(3)md5 目录

(4)pri 目录

(5)res 目录

这是 table 目录下记录某个数据块不一致的一个例子

这是 diff 目录下记录某个数据行不一致的一个例子

(6)skip.log 文件

本工具是参考了 pt-table-checksum 工具的一些思路并结合自身经验进行改写,尚有很多不足之处,仅做学习交流之用, 如有线上环境使用需求,请在测试环境充分测试。

㈨ SQL语言的checksum函数校验的是什么

研究了一下
checksum意思是和校验,与hash又有关
实验
declare @a int
declare @b int
set @a=6
set @b=31
select checksum(@a,@b),checksum(@a)*16+checksum(@b),checksum(@a),checksum(@b)

当 @a=1 @b=32 时 checksum(@a,@b)=checksum(@a)*16+checksum(@b)
换几个参数发现有时候不等
再实验又发现 checksum(1,16)=0
推断 checksum(@a,@b)与checksum(@a),checksum(@b)
的16进制数有关 而却不只一两种算法