前言:
最近这段时间,更新的不够及时,在这里为大家道歉。前两天在南京的PG分会举办的非常成功,也是我人生中第一次上台分享,还是觉得开心和激动的。下面配图一张。

但是最近确实文章的更新不够及时,后续会为大家补上,本篇介绍如何在HaloDB实现MySQL模式下replace into语法。
来,日常打广环节到了!
我们的HaloDB 是业内首次创造性的提出插件式内核架构设计,通过配置的方式,适配不同的应用场景,打造全场景覆盖的能力,满足企业大部分数据存储处理需求,从而消除数据孤岛,降低系统复杂度,保护企业既有投资,降低企业成本。同时支持x86、arm等异构平台之间的混合部署。
如果有对我们的产品感兴趣的朋友可以通过主页的联系方式与我取得联系,获取license来安装体验,当然您如果有好的建议也可以提给我们,下面正式开始今天的内容。
一、什么是replace into语法:
在原生的MySQL中, replace与replace into都是经常会用到的功能;replace其实是做了一次update操作,而不是先delete再insert;而replace into其实与insert into很相像,但对于replace into,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。replace是mysql 里面处理字符串比较常用的函数,可以替换字符串中的内容。而在我们的HaloDB的for MySQL中,可以完美的实现此项功能。
replace into 主要作用类似insert插入操作。主要的区别是replace会根据主键或者唯一索引检查数据是否存在,如果存在就先删除在更新。
二、如何在HaloDB中实现replace into语法:
确认您的HaloDB FOR MySQL模式已经开启,包含下面的几项内容,如果不知道怎么开启HaloDB for MySQL模式,可以参考 Halo DB 14 小白零基础系列(10)--HaloDB中MySQL模式下的流复制实现
1、数据库参数database_compat_mode已设置为mysql:
#database_compat_mode = 'postgresql' 修改为 database_compat_mode = 'mysql'
#second_listener_on = false 修改为 second_listener_on = 1
#mysql.halo_mysql_version = '5.7.32-log' 修改为 mysql.halo_mysql_version = '8.0.21-log'
#mysql.ci_collation = true 修改为 mysql.ci_collation = true2、数据库参数standard_parserengine_auxiliary已设置为on:
halo0root=# show standard_parserengine_auxiliary;
standard_parserengine_auxiliary
---------------------------------
on
(1 row)3、扩展aux_mysql已安装:
halo0root=# -- 查看数据库有哪些可加载的扩展模块
halo0root=# SELECT * FROM pg_available_extensions;
name | default_version | installed_version | comment
--------------------+-----------------+-------------------+------------------------------------------------------------------------
plpgsql | 1.0 | 1.0 | PL/pgSQL procedural language
plorasql | 1.0 | | Oracle Compatibal SQL (PL/SQL) procedural language
pldb2sql | 1.0 | | DB2 Compatibal SQL (PL/SQL) procedural language
plperl | 1.0 | | PL/Perl procedural language
plperlu | 1.0 | | PL/PerlU untrusted procedural language
plpython2u | 1.0 | | PL/Python2U untrusted procedural language
plpythonu | 1.0 | | PL/PythonU untrusted procedural language
adminpack | 2.1 | | administrative functions for PostgreSQL
amcheck | 1.3 | | functions for verifying relation integrity
aux_db2 | 1.0 | | DB2 Supplementary Extension
aux_init | 1.0 | 1.0 | Init Supplementary Extension
aux_mysql | 1.4 | 1.4 | MySQL Supplementary Extension
(省略)..... 4、数据库服务已重新启动:
[halo@halodb1 ~]$ pg_ctl restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2024-04-03 13:56:17.426 CST [4539] LOG: starting 羲和(Halo) 1.0.14.10 (231130) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2024-04-03 13:56:17.427 CST [4539] LOG: listening on IPv4 address "0.0.0.0", port 1921
2024-04-03 13:56:17.427 CST [4539] LOG: listening on IPv6 address "::", port 1921
2024-04-03 13:56:17.429 CST [4539] LOG: listening on Unix socket "/var/run/halo/.s.PGSQL.1921"
2024-04-03 13:56:17.431 CST [4539] LOG: listening on IPv4 address "0.0.0.0", port 3306
2024-04-03 13:56:17.431 CST [4539] LOG: listening on IPv6 address "::", port 3306
2024-04-03 13:56:17.433 CST [4539] LOG: listening on Unix socket "/var/run/halo/.s.PGSQL.3306"
2024-04-03 13:56:17.438 CST [4540] LOG: database system was shut down at 2024-04-03 13:56:17 CST
2024-04-03 13:56:17.443 CST [4539] LOG: database system is ready to accept connections
done
server starteds三、测试用例:
我分别在原生的PG和我们的HaloDB 使用相同的案例进行测试。测试结果如下:
1、原生PostgreSQL:
postgres=# CREATE TABLE TEST(
id int,
age smallint,
sex char(1),
sexname varchar(10),
name varchar(20),
address varchar(30),
primary key(id)
);
CREATE TABLE
postgres=# INSERT INTO test values (1,21,'M','M','张三','浙江杭州上城区');
INSERT 0 1
postgres=# replace into test (id,age,sex,sexname,name,address) values(1,21,'M','M','张三22','浙江杭州上城区');
ERROR: syntax error at or near "replace"
LINE 1: replace into test (id,age,sex,sexname,name,address) values(1...
^
postgres=# select * from TEST;
id | age | sex | sexname | name | address
----+-----+-----+---------+------+----------------
1 | 21 | M | M | 张三 | 浙江杭州上城区
(1 row)
postgres=#
2、HaloDB for MySQL模式:
halo0root=# CREATE TABLE TEST(
id int,
age smallint,
sex char(1),
sexname varchar(10),
name varchar(20),
address varchar(30),
primary key(id)
);
CREATE TABLE
halo0root=# INSERT INTO test values (1,21,'M','M','张三','浙江杭州上城区');
INSERT 0 1
halo0root=# select * from test;
id | age | sex | sexname | name | address
----+-----+-----+---------+------+----------------
1 | 21 | M | M | 张三 | 浙江杭州上城区
(1 row)
halo0root=# replace into test (id,age,sex,sexname,name,address) values(1,21,'M','M','张三22','浙江杭州上城区');
INSERT 0 1
halo0root=# select * from test;
id | age | sex | sexname | name | address
----+-----+-----+---------+--------+----------------
1 | 21 | M | M | 张三22 | 浙江杭州上城区
(1 row)
HaloDB for MySQL模式还是十分给力的,各位看官如果感兴趣,可以联系我获取license测试使用。




