lightdb mysql 8.0兼容之不可见主键
数据库设计通常需要满足一定的范式要求,其中主键更是最基本的要求。不过,数据库管理系统却允许我们创建没有主键的表。这样的表在数据库中会带来查询性能低下、复制延迟甚至无法实现高可用配置等问题。
为此,lightdb在22.1版本引入了一个新的功能,叫做不可见主键(Generated Invisible Primary Keys),它可以自动为没有显式指定主键的表创建一个不可见的主键。其用法是建表时指定WITH PRIMARY KEY
语法,表示创建一个表,含有ltapk
自增主键。如下:
-- 建表指定自增主键 postgres@postgres=# create table t1(a int) with primary key; CREATE TABLE -- 查询表t1, ltapk列为隐藏列 postgres@postgres=# select * from t1; a --- (0 rows) -- 插入数据 postgres@postgres=# insert into t1 values(1); INSERT 0 1 postgres@postgres=# insert into t1 values(2); INSERT 0 1 postgres@postgres=# select * from t1; a --- 1 2 (2 rows) -- 显示指定ltapk列 postgres@postgres=# select a,ltapk from t1; a | ltapk ---+------- 1 | 1 2 | 2 (2 rows)
ltapk字段在select *,insert into t values()等未明确指定字段的增删改查中是不可见的,所以现有系统增加不可见隐藏字段完全无侵入。但是能解决基于主键批量同步或者复制时无法唯一标识记录问题。
mysql 8.0也有一个对应的特性,通过参数sql_generate_invisible_primary_key控制,详见https://blog.itpub.net/70027826/viewspace-3010838/。
注:在做这个功能时,其实我们并不是针对兼容mysql去的,那会儿还没有专门去看mysql有没有这个特性,是因为我们有客户基于id变更复制的需求。
详见:https://www.light-pg.com/docs/lightdb-cn/current/sql-createtable.html
其他实用特性还包括,不可见自动更新时间戳。with update current_tiemstamp。