暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

Halo DB 14 小白零基础系列(11)--在HaloDB中replace into 的实现

原创 Salvatore-zz 2024-04-03
312

前言:

        最近这段时间,更新的不够及时,在这里为大家道歉。前两天在南京的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 = true

2、数据库参数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测试使用。

最后:

            虽然是慢工,但是不是什么细活。







最后修改时间:2024-07-05 22:54:30
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论