前言
为了让MySQL的利用更为便捷地迁徙到KunlunDB,咱们做了很多兼容MySQL的工作。
本篇章次要介绍KunlunDB当初曾经反对的MySQL罕用的公有DML语法,以及这些语法与原生MySQL的差别。
一、兼容MySQL的insert ignore语法
性能: 疏忽违反惟一束缚的新元组。
示例:
postgres -> create table t1(a int primary key, b int not null unique);CREATE TABLE# 违反惟一束缚,不进行插入postgres -> insert ignore into t1(a,b) values (4,4);INSERT 0 1postgres -> insert ignore into t1(a,b) values (4,4);INSERT 0 0
和原生MySQL的差别:
- 只疏忽唯一性束缚,如果违反其余束缚(例如分区束缚、非null束缚),则报错。
例如:
postgres -> insert ignore into t1(a,b) values (4,NULL);ERROR: null value in column "b" violates not-null constraintDETAIL: Failing row contains (4, null)
二、兼容MySQL的INSERT...ONDUPLICATE KEY UPDATE...语法
性能:插入数据;如果违反了某个惟一束缚,则转变为更新操作,对其中一个抵触的元组进行更新。
示例:
postgres -> create table t1 (a int primary key, b int not null unique);CREATE TABLEpostgres -> insert into t1 values(3,3), (4,4);INSERT 0 2# 插入的数据和已有的两个元组都抵触,但只更新了其中一个元组(3,3)postgres -> insert into t1 values(3,4) on duplicate key update b=2;INSERT 0 2postgres -> select * from t1; a | b---+--- 3 | 2 4 | 4
和原生MySQL的差别:
- 暂不反对在ON DUPLICATE KEY UPDATE子句中应用VALUES()函数来援用新值,能够应用excluded虚构表来代替。
例如:
postgres -> INSERT INTO t1 VALUES(3,0) ON DUPLICATE KEY UPDATE b = excluded.b;INSERT 0 2postgres -> select * from t1; a | b---+--- 3 | 0 4 | 4(2rows)postgres -> INSERT INTO t1 VALUES(3,0) ON DUPLICATE KEY UPDATE b=VALUES(b);ERROR: syntax error at or near "VALUES"
- 往长期表批量写入多个新元组时,如果新元组之间存在唯一性抵触,则会报错(根本原因是长期表存在于计算节点,应用的不是innodb引擎)。
例如:
postgres -> create temp table t1(a int primary key, b int not null unique);CREATE TABLEpostgres -> INSERT INTO t1 VALUES(5,5), (5,6) ON DUPLICATE KEY UPDATE b = excluded.b;ERROR: ON CONFLICT DO UPDATE command cannot affect row a secondtimeHINT: Ensure that norows proposed for insertion within the same command have duplicate constrained values.postgres ->
- 长期表返回的影响行数的差别。即便更新前后的值雷同,长期表返回的影响行数依然大于0。
例如:
postgres -> create temp table t1(a int primary key, b int not null unique);CREATE TABLEpostgres -> INSERT INTO t1 VALUES(5,5) ON DUPLICATE KEY UPDATE b=excluded.b;INSERT 0 1postgres -> INSERT INTO t1 VALUES(5,5) ON DUPLICATE KEY UPDATE b=excluded.b;INSERT 0 1
三、兼容mysql的replace into语法
性能:插入元组;如果存在抵触的旧元组,则删除所有与之抵触的旧元组。
示例:
postgres -> create table t1(a int primary key, b int not null unique);CREATE TABLEpostgres -> insert into t1 values(3,3),(4,4);INSERT 0 2postgres -> replace into t1 values(3,4);INSERT 0 3postgres -> select * from t1; a | b---+--- 3 | 4(1row)
和原生MySQL的差别:
- 往长期表批量写入多个新元组时,如果新元组之间存在唯一性抵触,则会报错(根本原因是长期表存在于计算节点,应用的不是innodb引擎)。
例如:
postgres -> create table t1(a int primary key, b int not null unique);CREATE TABLEpostgres -> replace into t1 values(1,1),(1,2);INSERT 0 3postgres -> create temp table t2(a int primary key,b int not null unique);CREATE TABLEpostgres -> replace into t2 values(1,1),(1,2);ERROR: REPLACEINTO command cannot affect row a secondtimeHINT: Ensure that norows proposed for insertion within the same command have duplicate constrained values.
四、兼容MySQL的update/delete...order by...limit.. 语法
性能:指定更新/删除的元组的程序和数量。
示例:
postgres -> create table t1 (a int primary key, b int);CREATE TABLEpostgres -> insert into t1 select generate_series(1,100),generate_series(1,100);INSERT 0 100# 对非分区表的有序更新postgres -> update t1 set b=b+1 order by a desc limit 4 returning*; a | b-----+----- 100 | 101 99 | 100 98 | 99 97 | 98(4rows)UPDATE 4postgres -> drop table t1;DROP TABLEpostgres -> CREATE TABLE t1 (A INT PRIMARY KEY,B INT) PARTITION BY RANGE(a);CREATE TABLEpostgres -> CREATE TABLE t1p1 PARTITION OF t1 FOR VALUES FROM (0) TO (100);CREATE TABLEpostgres -> CREATE TABLE t1p2 PARTITION OF t1 FOR VALUES FROM (100) TO (200);CREATE TABLEpostgres -> insert into t1 select generate_series(0,199);INSERT 0 200# 指定分区表删除的总量postgres -> delete from t1 limit 4 returning *; a | b---+--- 0 | 1 | 2 | 3 |(4rows)DELETE 4
和原生MySQL的差别:
- 暂不反对指定分区表的更新/删除的程序(留神:长期表的分区表曾经反对)。 当然,理论应用中须要严格规定更新/删除程序的场景是极少的,这一限度并不会对KunlunDB的用户造成困扰。
例如:
postgres -> CREATE TABLE t1 (A INT PRIMARY KEY, B INT) PARTITION BY RANGE(a);CREATE TABLEpostgres -> CREATE TABLE t1p1 PARTITION OF t1 FOR VALUESFROM (0) TO (100);CREATE TABLEpostgres -> CREATE TABLE t1p2 PARTITION OF t1 FORVALUESFROM (100) TO (200);CREATE TABLE# 不能指定分区表删除程序postgres -> delete from t1 order by a limit 4 returning *;ERROR: Kunlun-db: Cannot push down planpostgres ->
END
昆仑数据库是一个HTAP NewSQL分布式数据库管理系统,能够满足用户对海量关系数据的存储管理和利用的全方位需要。
利用开发者和DBA的应用昆仑数据库的体验与单机MySQL和单机PostgreSQL简直完全相同,因为首先昆仑数据库反对PostgreSQL和MySQL双协定,反对规范SQL:2011的 DML 语法和性能以及PostgreSQL和MySQL对规范 SQL的扩大。同时,昆仑数据库集群反对程度弹性扩容,数据主动拆分,分布式事务处理和分布式查询处理,强壮的容错容灾能力,欠缺直观的监测剖析告警能力,集群数据备份和复原等 罕用的DBA 数据管理和操作。所有这些性能无需任何利用零碎侧的编码工作,也无需DBA人工染指,不停服不影响业务失常运行。
昆仑数据库具备全面的OLAP 数据分析能力,通过了TPC-H和TPC-DS规范测试集,能够实时剖析最新的业务数据,帮忙用户发掘出数据的价值。昆仑数据库反对私有云和公有云环境的部署,能够与docker,k8s等云基础设施无缝合作,能够轻松搭建云数据库服务。
请拜访 http://www.zettadb.com/ 获取更多信息并且下载昆仑数据库软件、文档和材料。
KunlunDB我的项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb