数据库国产化之路(一)
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"
小尾巴~~
只要有积累,就会有进步