数据库国产化之路(一)

数据库国产化之路(一)

1、前言:适配海量数据库过程中的一些记录,备忘用

2、海量数据库基于的pg版本,查看PG_VERSION文件为9.2。

3、MySQL中的IF函数替代,一开始的方案是从网上找了个if函数,后来发现CASE WHEN其实能完成三元运算。

-- MySQL的IF函数,完成三元运算
SELECT 
	IF((field_rename IS NOT NULL AND field_rename <> ''), field_rename, field_name) AS "fieldName"
FROM archive_field_control 	

-- 海量数据库/PostgreSQL
SELECT 
	CASE WHEN (field_rename IS NOT NULL AND field_rename <> '') THEN field_rename ELSE field_name END AS "fieldName"
FROM archive_field_control 

-- 仔细看下面转换时的区别,在MySQL中存在很多隐士类型转换,比如IF中第一个参数,只要大于0,就是true,而在PG中不能这样写,必须严格写好数据类型,与0进行比较返回bool值
-- MySQL的IF函数,完成三元运算
SELECT
	IF((SELECT COUNT(*) FROM archive_field_control afc WHERE afc.field_id = af.id),1,0) AS "field_use"
FROM archive_field af

-- 海量数据库/PostgreSQL
SELECT
	CASE WHEN ((SELECT COUNT(*) FROM archive_field_control afc WHERE afc.field_id = af.ID )>0) THEN 1 ELSE 0 END AS "field_use"
FROM archive_field af

4、海量数据库中,给字段设置为空字符,在数据库中存的是null(不知道是否进行了个性化设置,原因未知)
验证了MySQL、翰高、pg数据库,不会出现这种情况。下面是测试记录。

在这里插入图片描述

5、海量数据库不支持 RESTART IDENTITY

# 清空表不能使用RESTART IDENTITY重置序列,这个特性从pg10开始有
TRUNCATE archive_field_control RESTART IDENTITY;

-- 设置序列的值;有数据时,最大id+1,没有数据时从1开始,通过调整is_called true或false,true时从下一个值开始,false时从当前值开始
SELECT setval('archive_field_control_id_seq', (select COALESCE(max(id),1) from archive_field_control), (SELECT (SELECT CASE WHEN (SELECT(SELECT max(id) from archive_field_control) IS NULL) THEN FALSE ELSE TRUE END)));

6、在海量数据库中其他注意事项

-- 这里面的condtion field_rename IS NOT NULL AND field_rename <> '' 或者 field_rename IS NOT NULL AND field_rename != '',不能返回预期结果(不管是本身未设置值还是设置了空字符'',条件竟然会返回true,有点凌乱)
CASE WHEN (field_rename IS NOT NULL AND field_rename <> '') THEN field_rename ELSE field_name END AS "fieldName"

-- 把后面的空字符判断去掉可以返回预期结果(前面验证过他空值也会存为null,这里直接判断null,歪打正着么)
CASE WHEN (field_rename IS NOT NULL) THEN field_rename ELSE field_name END AS "fieldName"

小尾巴~~
只要有积累,就会有进步

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值