-
GaussDB数据库中的MERGE INTO介绍一、前言随着数据量的爆炸性增长,数据库管理系统(DBMS)的功能和性能要求也在不断提升。GaussDB 作为一款先进的关系型数据库管理系统,其 MERGE INTO 语句在数据整合、更新操作中发挥了重要作用。MERGE INTO 语句允许用户在单次操作中执行插入和更新操作,大大提高了数据处理效率。本文将举例为大家讲述 GaussDB 中 MERGE INTO 语句的使用。二、GaussDB MERGE INTO 语句的原理概述1、MERGE INTO 语句原理GaussDB 的 MERGE INTO 语句是基于 SQL 标准的,通过单个SQL语句实现了数据的UPDATE和INSERT操作。该语句在执行时,会根据指定的条件比较源表和目标表的数据。当源表和目标表中数据针对关联条件可以匹配上时,则进行UPDATE操作;当源表和目标表中数据针对关联条件无法匹配时,则进行INSERT操作。这种操作方式减少了数据传输的开销,避免多次执行,提高了数据处理的效率。2、MERGE INTO 的语法MERGE [/*+ plan_hint */] INTO table_name [ partition_clause ] [ [ AS ] alias ]USING { { table_name | view_name } | subquery } [ [ AS ] alias ]ON ( condition )[WHEN MATCHED THENUPDATE SET { column_name = { expression | subquery | DEFAULT } |( column_name [, ...] ) = ( { expression | subquery | DEFAULT } [, ...] ) } [, ...][ WHERE condition ]][WHEN NOT MATCHED THENINSERT { DEFAULT VALUES |[ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] }];where partition_clause can be:PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } |SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) }NOTICE: 'partition_clause' is only avaliable in CENTRALIZED mode!NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!3、语法解释权限:进行MERGE INTO操作的用户需要同时拥有目标表的UPDATE和INSERT权限,以及源表的SELECT权限。plan_hint子句:可选,以/*+ */的形式在MERGE关键字后,用于对MERGE对应的语句块生成的计划进行hint调优INTO talbe_name:指定正在更新或插入的目标表。USING子句:指定源表,源表可以为表、视图或子查询。ON子句:关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。WHEN MATCHED / WHEN NOT MATCHED子句:不支持INSERT子句中包含多个VALUES。WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。DEFAULT:用对应字段的缺省值填充该字段。如果没有缺省值,则为NULL。WHERE condition:UPDATE子句和INSERT子句的条件,只有在条件满足时才进行更新操作,可缺省。不支持WHERE条件中引用系统列。三、GaussDB MERGE INTO 语句的应用场景MERGE INTO 语句在多种场景中都有广泛的应用。例如,在数据迁移过程中,可以使用 MERGE INTO 语句将源数据库中的数据迁移到目标数据库,同时保证数据的完整性和一致性。此外,在数据整合、ETL过程、实时数据处理等场景中,MERGE INTO 语句都能发挥其高效的数据处理能力。四、GaussDB MERGE INTO 语句的示例1、示例场景举例假设我们有两个表:source_table 和 target_table。source_table 包含最新的销售数据,而 target_table 存储历史销售数据。我们的目标是更新 target_table 中的销售数据,并插入新的销售记录。2、示例实现过程以下是使用 GaussDB MERGE INTO 语句的实现示例1)创建两个实验表,并初始化测试数据--创建测试表target_table,存储历史销售数据CREATE TABLE public.target_table(product_id VARCHAR(20),product_name VARCHAR(20),sales_sum_number INT,sales_sum_amount MONEY,create_date VARCHAR(8),update_date VARCHAR(8));--插入测试数据INSERT INTO public.target_table(product_id,product_name,sales_sum_number,sales_sum_amount,create_date,update_date) VALUES('P1001','books',100,1000,'20240101','30001231');INSERT INTO public.target_table(product_id,product_name,sales_sum_number,sales_sum_amount,create_date,update_date) VALUES('P1002','pens',200,400,'20240102','30001231');--创建测试表source_table,包含最新的销售数据CREATE TABLE public.source_table(product_id VARCHAR(20),product_name VARCHAR(20),sales_sum_number INT,sales_sum_amount MONEY,create_date VARCHAR(8));--插入测试数据INSERT INTO public.source_table(product_id,product_name,sales_sum_number,sales_sum_amount,create_date) VALUES('P1001','books',50,500,'20240103');INSERT INTO public.source_table(product_id,product_name,sales_sum_number,sales_sum_amount,create_date) VALUES('P1003','toys',100,1000,'20240103');--查看结果SELECT * FROM public.target_table;SELECT * FROM public.source_table;2)更新 target_table 中的销售数据,并插入新的销售记录。--更新 target_table 中的销售数据,并插入新的销售记录。MERGE INTO target_table AS tUSING source_table AS sON (t.product_id = s.product_id)WHEN MATCHED THENUPDATE SET t.sales_sum_number=t.sales_sum_number + s.sales_sum_number,t.sales_sum_amount = t.sales_sum_amount + s.sales_sum_amount,t.update_date = s.create_dateWHEN NOT MATCHED THENINSERT (product_id,product_name,sales_sum_number,sales_sum_amount,create_date,update_date) VALUES (s.product_id,s.product_name,s.sales_sum_number,s.sales_sum_amount,s.create_date,'30001231');--查看执行结果SELECT * FROM public.target_table;3)查看并比对执行结果更新之前的目标表target_table:源表source_table:更新之后的目标表target_table:上述示例中,我们通过 MERGE INTO 语句将 source_table 中的销售数据与 target_table 中的数据进行匹配。在目标中,产品“P1001”销售数量增加了50,销售金额增加了500,更新日期更新为源表中的创建日期。产品“P1002”的销售数据没有变化。产品“P1003”作为一条新的销售数据插入到了历史表(目标表)中。这样,我们就轻松地将最新的销售数据整合到 target_table 中,同时保持数据的完整性和一致性。特别说明:在实际业务操作时,需要提前做好规划,确保执行的准确定、数据的准确性以及数据的安全性,同时做好各个环节的备份等操作。五、小结MERGE INTO 语句在GaussDB数据库中是一个非常好用、方便的SQL工具。同时,在数据处理工作中起着非常重要的作用,它能够提高数据处理效率,简化数据处理流程,满足各种数据处理需求。本文通过在GaussDB数据库中模拟了一则简单的示例为大家进行了讲解,希望可以帮助读者更好的理解与使用。——结束
-
[omm@node01 ~]$ cm_ctl query -Cvipd[ CMServer State ]node node_ip instance state--------------------------------------------------------------------------------1 192.168.30.51 192.168.30.51 1 /gaussdb/cluster/data/cm/cm_server Primary2 192.168.30.52 192.168.30.52 2 /gaussdb/cluster/data/cm/cm_server Standby3 192.168.30.53 192.168.30.53 3 /gaussdb/cluster/data/cm/cm_server Standby[ ETCD State ]node node_ip instance state------------------------------------------------------------------------------1 192.168.30.51 192.168.30.51 7001 /gaussdb/cluster/data/etcd StateFollower2 192.168.30.52 192.168.30.52 7002 /gaussdb/cluster/data/etcd StateFollower3 192.168.30.53 192.168.30.53 7003 /gaussdb/cluster/data/etcd StateLeader[ Cluster State ]cluster_state : Degradedredistributing : Nobalanced : Nocurrent_az : AZ_ALL[ Coordinator State ]node node_ip instance state----------------------------------------------------------------------1 192.168.30.51 192.168.30.51 5001 8000 /gaussdb/cluster/data/cn Deleted2 192.168.30.52 192.168.30.52 5002 8000 /gaussdb/cluster/data/cn Normal3 192.168.30.53 192.168.30.53 5003 8000 /gaussdb/cluster/data/cn Deleted[ Central Coordinator State ]node node_ip instance state----------------------------------------------------------------------2 192.168.30.52 192.168.30.52 5002 /gaussdb/cluster/data/cn Normal[ GTM State ]node node_ip instance state sync_state-------------------------------------------------------------------------------------------------------1 192.168.30.51 192.168.30.51 1001 /gaussdb/cluster/data/gtm P Primary Connection ok Sync2 192.168.30.52 192.168.30.52 1002 /gaussdb/cluster/data/gtm S Standby Connection ok Sync3 192.168.30.53 192.168.30.53 1003 /gaussdb/cluster/data/gtm S Standby Connection ok Sync[ Datanode State ]node node_ip instance state | node node_ip instance state | node node_ip instancestate---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1 192.168.30.51 192.168.30.51 6001 33100 /gaussdb/cluster/data/dn/dn_6001 P Primary Normal | 2 192.168.30.52 192.168.30.52 6002 33100 /gaussdb/cluster/data/dn/dn_6002 S Standby Normal | 3 192.168.30.53 192.168.30.53 6003 33100 /gaussdb/cluster/data/dn/dn_6003S Standby Normal2 192.168.30.52 192.168.30.52 6004 33120 /gaussdb/cluster/data/dn/dn_6004 P Standby Normal | 1 192.168.30.51 192.168.30.51 6005 33120 /gaussdb/cluster/data/dn/dn_6005 S Primary Normal | 3 192.168.30.53 192.168.30.53 6006 33120 /gaussdb/cluster/data/dn/dn_6006S Standby Normal3 192.168.30.53 192.168.30.53 6007 33140 /gaussdb/cluster/data/dn/dn_6007 P Primary Normal | 2 192.168.30.52 192.168.30.52 6008 33140 /gaussdb/cluster/data/dn/dn_6008 S Standby Normal | 1 192.168.30.51 192.168.30.51 6009 33140 /gaussdb/cluster/data/dn/dn_6009S Standby Normal[omm@noGaussdb分布式 集群状态为degraded,其中2个节点显示为delete,如何让集群状态回归正常?
-
--登录数据库 su - omm gsql -d postgres -h 192.168.30.51 -U root -p 8000 --创建用户 CREATE USER tpcds WITH PASSWORD 'Zdxjyyds.!'; --创建数据库 CREATE DATABASE dxj ENCODING='UTF8'; --更改数据库dxj归属用户tpcds alter database dxj owner to tpcds; --赋予权限 grant usage on schema public to tpcds; grant all privileges on schema public to tpcds; --切换用户和数据库 \c dxj tpcds CREATE TABLE customer_address ( ca_address_sk integer NOT NULL , ca_address_id character(16) NOT NULL , ca_street_number character(10) , ca_street_name character varying(60) , ca_street_type character(15) , ca_suite_number character(10) , ca_city character varying(60) , ca_county character varying(30) , ca_state character(2) , ca_zip character(10) , ca_country character varying(20) , ca_gmt_offset numeric(5,2) , ca_location_type character(20) ) DISTRIBUTE BY HASH (ca_address_sk) PARTITION BY RANGE (ca_address_sk) ( PARTITION P1 VALUES LESS THAN(5000), PARTITION P2 VALUES LESS THAN(10000), PARTITION P3 VALUES LESS THAN(15000), PARTITION P4 VALUES LESS THAN(20000), PARTITION P5 VALUES LESS THAN(25000), PARTITION P6 VALUES LESS THAN(30000), PARTITION P7 VALUES LESS THAN(40000), PARTITION P8 VALUES LESS THAN(MAXVALUE) ) ENABLE ROW MOVEMENT;提示如下报错:--问题描述 ERROR: permission denied for schema public DETAIL: N/A
-
--问题描述 创建自定义表空间报错gaussdb=> CREATE TABLESPACE test RELATIVE LOCATION '/gaussdb/test/'; ERROR: relative location can only be formed of 'a~z', 'A~Z', '0~9', '-', '_' and two level directory at most
-
请问在那个数据库执的SQL语句,在gs_log日志不记录吗?应该在哪里查看?
-
官网也搜不到相关的信息!!!!!!!这是配置信息tpops元库信息
-
图片竟然要求本地上传,真是out得很啊,期待快些改进
-
GaussDB数据库修改同步备机数量背景说明当前使用的测试环境为GaussDB主备集群1主3备1仲裁共5个节点,由于测试的需要,现需要把同步备的数量修改为1。操作步骤1、根据当前的版本,如果裸金属部署版本大于等于503.2版本且需要把synchronous_standby_names的参数修改为any1或first1,需要修改enable_az_auto_switchover参数为0,否则不需要修改该参数,跳过该步骤enable_az_auto_switchover参数说明:AZ自动切换开关,若打开,则表示允许cm_server自动切换AZ。否则当发生dn故障等情况时,即使当前AZ已经不再可用,也不会自动切换到其它AZ上,除非手动执行切换命令。取值范围:非负整型,0或1,0表示开关关闭,1表示开关打开。修改后可以reload生效,参数修改请参考表14-2进行设置。默认值:1gs_guc reload -Z cmserver -N all -I all -c "enable_az_auto_switchover"="0"2、查询当前synchronous_standby_names参数在各个DN节点的配置synchronous_standby_names,当前集群该参数默认为ANY 2参数说明:潜在同步复制的备机名称列表,每个名称用逗号分隔。当前连接的同步备机是列表中的第一个名称。如果当前同步备机失去连接,则它会立即更换下一个优先级更高的备机,并将此备机的名称放入列表中。备机名称可以通过设置环境变量PGAPPNAME指定。取值范围:字符串。当取值为*,表示匹配任意提供同步复制的备机名称。支持按如下格式配置:● ANY num_sync (standby_name [, …]) [, ANY num_sync (standby_name [, …])]● [FIRST] num_sync (standby_name [, …])● standby_name [, …]说明1.其中num_sync是事务需要等待其回复的同步复制的备机的数量,standby_name是备机的名称,FIRST以及ANY指定从所列服务器中选取同步复制的备机的策略。2.ANY N (dn_instanceId1, dn_instanceId2,…)表示在括号内任选N个主机名称作为同步复制的备机名称列表。例如,ANY 1(dn_instanceId1, dn_instanceId2)表示在dn_instanceId1和dn_instanceId2中任选一个作为同步复制的备机名称。3.FIRST N (dn_instanceId1, dn_instanceId2,…)表示在括号内按出现顺序的先后作为优先级选择前N个主机名称作为同步复制的备机名称列表。例如,FIRST 1 (dn_instanceId1,dn_instanceId2)表示选择dn_instanceId1作为同步复制的备机名称。4.dn_instanceId1, dn_instanceId2,…和FIRST 1 (dn_instanceId1, dn_instanceId2,…)具有的含义相同。[omm@ZHHALxjspo0db009 ~]$ gs_guc check -Z datanode -N all -I all -c "synchronous_standby_names" The gs_guc run with the following arguments: [gs_guc -Z datanode -N all -I all -c synchronous_standby_names check ]. Total GUC values: 4. Failed GUC values: 0. The details for synchronous_standby_names: [103.X.X.171] synchronous_standby_names='ANY 2(dn_6002,dn_6003,dn_6004)' [/data/data/dn/dn_6001/postgresql.conf] [103.X.X.172] synchronous_standby_names='ANY 2(dn_6001,dn_6003,dn_6004)' [/data/data/dn/dn_6002/postgresql.conf] [103.X.X.173] synchronous_standby_names='ANY 2(dn_6004,dn_6001,dn_6002)' [/data/data/dn/dn_6003/postgresql.conf] [103.X.X.174] synchronous_standby_names='ANY 2(dn_6003,dn_6001,dn_6002)' [/data/data/dn/dn_6004/postgresql.conf] 3、根据查询节点的配置然后修改命令并分别在对应节点执行如下命令--DN1节点执行 gs_guc reload -Z datanode -D /data/data/dn/dn_6001 -N 103.161.73.171 -c "synchronous_standby_names='ANY 1(dn_6002,dn_6003,dn_6004)'" --DN2节点执行 gs_guc reload -Z datanode -D /data/data/dn/dn_6002 -N 103.161.73.172 -c "synchronous_standby_names='ANY 1(dn_6001,dn_6003,dn_6004)'" --DN3节点执行 gs_guc reload -Z datanode -D /data/data/dn/dn_6003 -N 103.161.73.173 -c "synchronous_standby_names='ANY 1(dn_6004,dn_6001,dn_6002)'" --DN4节点执行 gs_guc reload -Z datanode -D /data/data/dn/dn_6004 -N 103.161.73.174 -c "synchronous_standby_nam作者:墨竹
-
【任务背景】某公司为自己新上市的产品运营投入了30000元,现在需要分析用户行为数据和充值情况计算投入产出比(ROI),请根据以下提示在TaurusDB中使用SQL基本操作获取汇报所需的数据!回复带有华为云账号的正确数据截图,第二天上午12点前将会收到抽奖链接进行抽奖!活动时间:即日起-2024.12.30 12:00抽奖礼品奖品名称数量备注开发者装备包31.抽奖链接将于正确回帖后的第二天12点前私信发送2.每个华为云账号仅一次抽奖机会3.回帖格式:数字(可保留两位小数)+带有华为云账号和查询结果的截图4.完成正确回帖方可参与有效抽奖,未完成正确回帖或回帖账号与抽奖账号不一致视为无效抽奖GaussDB定制手机支架20GaussDB定制咖啡杯50华为云资源代金券100回帖示例:ROI:xxx(正确数字)实验准备点击领取华为云云资源代金券(抵扣实验消耗)>>>注册/登录华为云账号并完成实名认证购买华为云数据库TaurusDB进入华为云 官网:cid:link_2购买云数据库TaurusDB资源,提交后,“返回云数据库TaurusDB列表”,等待创建完成,等待过程大概需要十分钟 购买规格如下: 计费模式:按需付费 区域:华北-北京四 实例类型:集群 可用区类型:默认即可 性能规格:默认即可 CPU架构:x86/鲲鹏;2vCPUs|8GB 管理员密码:自行设置其余各项默认,点击“立即购买”,确认后“提交” 创建数据库,导入数据表登录数据库实例,创建数据库userdate登录数据库:“登录”->输入密码,测试连接,打开按钮->点击“登录”新建数据库:点击“新建数据库”,输入数据库名称“userdate”,点击“确定” 2. 导入数据脚本userdate.sql:选择“导入”->“新建任务”按照如下参数导入【附件】数据表userdate.sql,点击“创建导入任务”导入类型:sql文件来源:上传文件附件存放位置:点击“创建OBS桶”完成创建选择附件:将文件userdate.sql用鼠标拖至上传区域其余选项默认即可 获取关键业务汇报数据返回“SQL查询”页面 2. 计算本次运营活动的ROI,回复带有华为云账号的正确数据截图,第二天上午10点前将会收到抽奖链接进行抽奖!ROI计算方式:回报/投入ROI计算SQL语句提示:select sum(payment_amount)/30000 FROM userdate 删除数据库实例,防止继续扣费 1. 点击“导入·导出”,删除已上传表格 2. 返回“云数据库TaurusDB控制台”,点击“更多”,选择“删除实例云数据库控制台:https://console.huaweicloud.com/gaussdbformysql/?region=cn-north-4&engine=taurus#/gaussdbformysql/management/list3. 进入“OBS桶列表”,选择“删除”注:桶内如果有对象无法进行删除,需点击进入桶,删除里面所有对象后,才能删除桶
-
OM:运维管理组件,提供触发式运维管理功能。每个节点都部署。 CM:集群管理组件,提供自动化集群管理功能。每个节点都部署。 GTM:全局事务管理,负责生成和维护全局事务ID、事务快照、时间戳等全局唯一的信息。 DWS集群部署2个,一主一备,分布在不同的节点上。 WLM:工作负载管理,控制系统资源的分配,防止过量业务负载对系统的冲击而导致业务拥塞和系统崩溃。 内置在CN,DN实例内。 CN:协调节点。负责接收来自应用的访问请求,并向客户端返回执行结果; 负责分解任务,并调度任务分片在各DN上并行执行。决定了对外提供的业务访问能力, 默认部署2个,最大支持5个,可以在console上增删CN实例。 DN:数据节点。负责存储业务数据(支持行存、列存、混合存储)、执行数据查询任务以及向CN返回执行结果。 决定了对外提供的业务处理能力,根据节点规格,每个节点部署2-4个,DWS目前最大支持1024个。
-
ETCD:分布式键值存储系统(Editable Text Configuration Daemon)。用于共享配置和服务发现(服务注册和查找)。CMS:集群管理模块(Cluster Manager)。管理和监控分布式系统中各个功能单元和物理资源的运行情况,确保整个系统的稳定运行。Data Node:数据节点DN,负责存储业务数据、执行数据查询任务以及返回执行结果。
-
Coordinator Node:协调节点CN,负责接收来自应用的访问请求,并向客户端返回执行结果;负责分解任务,并调度任务分片在各DN上并行执行。GTM:全局事务管理器(Global Transaction Manager),负责生成和维护全局事务ID、事务快照、时间戳、Sequence信息等全局唯一的信息。Data Node:数据节点DN,负责存储业务数据、执行数据查询任务以及向CN返回执行结果。
-
华为官网上面, 不同部署模式的驱动不相同:开发指南(分布式_8.x)开发指南(主备版_8.x)开发指南(分布式_3.x)开发指南(主备版_3.x)开发指南(分布式_2.x)开发指南(主备版_2.x)https://support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0055.html开发指南页
-
Gaussdb其实有多种版本.最开始 他支持多种兼容模式, 比如A代表oracle B代表MySQL PG代表PG数据库但是后来华为进行了一些收缩。现在应该是这样的模式:GaussDB 默认是PG模式. 华为云和私有化部署均有.GaussDB for MySQL 是 MySQL模式,也开始多种部署.GaussDB DWS 应该是数据仓库。RDS for mysql,postgresql,sqlserver,Mariadb都是开源数据库. 直接封装提供服务除此之外还有nosql数据库比如RDS for redis,mongodb 等。最后其实还有一个是 openGauss数据库他与GaussDB是不太一样的.不支持分布式, 只支持主从模式。
-
GaussDB与PostgreSQL的关系最早GaussDB内核引擎基于PostgreSQL9.2开源版本不断演进,根据PG-XC架构演生了多CN架构,主要开发了分布式执行框架(stream算子)、向量化引擎等领域中较重要的特性。目前GaussDB除了保留PostgreSQL的标准接口和公共函数外,在自研生态、架构和关键技术上也有了新的发展,开源了集中式部署的能力,重构了存储引擎和优化器。GaussDB与PostgreSQL有如下不同:PostgreSQL是进程模型,而GaussDB是线程池模型。PostgreSQL只支持行存,GaussDB有行存,列存,还有Ustore。PostgreSQL仅有集中式,GaussDB一套内核既支持集中式,又支持分布式。GaussDB有很多独特的特性,比如GTM-Lite、Numa-Aware、两地三中心、同城双集群、动态脱敏、全密态、防篡改。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签