我有一个带有自动递增id和跨两列的唯一约束的表,keycol1并且keycol2.
假设表中有这样的数据:
H| (id, keycol1, keycol2, col1, col2)
| (1, 'A', 'B', 'A', 'E' )
| (2, 'A', 'C', 'J', 'K' )
| (3, 'A', 'D', 'H', 'I' )
Run Code Online (Sandbox Code Playgroud)
然后我使用一条MERGE语句来更新对应于的所有记录keycol1:
MERGE tablename trg
USING (VALUES ('A','B','C','D'),
('A','C','E','F'),
('A','E','K','F'),
('A','F','L','M')) src(keycol1, keycol2, col1, col2)
ON trg.keycol = src.keycol AND trg.keycol2 = src.keycol2
WHEN MATCHED THEN
UPDATE
SET col1 = src.col1, col2 = src.col2
WHEN NOT MATCHED THEN
INSERT (keycol1, keycol2, col1, …Run Code Online (Sandbox Code Playgroud) 在Oracle 11gR2上,我最近遇到了一个非常有趣的情况,涉及阻塞(但是空闲!)MERGE语句,该语句挂起"来自客户端的SQL*Net消息"事件,导致后续的,并发执行的MERGE语句在第一个语句上阻塞" cursor:pin S等待X"事件.在Oracle Enterprise Manager中,可以观察到以下内容:
这种情况变得更加严重,因为上述Session-ID 1204无法被杀死:
alter system kill session 'sid,serial#';
alter system kill session 'sid,serial#' immediate;
Run Code Online (Sandbox Code Playgroud)
我们的DBA有时会破坏操作系统进程,但通常需要重新启动整个数据库.幸运的是,到目前为止,仅在测试系统上,从未投入生产.
我知道这可能是一个类似于这个相当含糊的问题中报告的类似问题:Oracle更新/插入卡住,DB CPU为100%,并发性高,来自客户端的SQL*Net等待消息.我还会再次报告,因为我有一个清晰的再现路径,我将作为答案报告.
我在存储过程中使用了 SQL ServerMERGE语句,在编译存储过程时出现此错误:
对象引用 [dbo].[Student].[ID] 与对象定义 [dbo].[Student].[Id] 的区别仅在于大小写。
我的表结构是:
CREATE TABLE [dbo].[Student]
(
[Id] INT NOT NULL,
[FirstName] VARCHAR (50) NULL,
[LastName] VARCHAR (50) NULL,
[StateID] INT NULL,
[CityID] INT NULL,
[IsActive] BIT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
)
Run Code Online (Sandbox Code Playgroud)
我的存储过程是:
CREATE PROCEDURE [dbo].USP_UpdateStudent
AS
Declare @Data xml
SET @Data = '<?xml version="1.0" encoding="utf-16"?>
<Students>
<Student>
<ID>2</ID>
<FirstName>Tridip</FirstName>
<LastName>Bhattacharjee</LastName>
<IsActive>true</IsActive>
<StateID>2</StateID>
<CityID>4</CityID>
</Student>
</Students>'
BEGIN TRY
MERGE INTO Student as Trg
USING (SELECT
d.x.value('id[1]', 'varchar(MAX)') as ID,
d.x.value('FirstName[1]', …Run Code Online (Sandbox Code Playgroud) 我创建了一个 Oracle 序列,如下所示:
CREATE SEQUENCE TASK_ID_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
Run Code Online (Sandbox Code Playgroud)
我有一个数据库表TASK如下:
TASK_ID nextval from TASK_ID_SEQ
TASK_DATE SYSDATE
TASK_TYPE <value fed from data>
Run Code Online (Sandbox Code Playgroud)
TASK如果中的日期TASK_TYPE尚未出现在表中,我需要插入一条新记录,否则忽略它。TASKTASK_DATE
下面的语法正确吗?
MERGE INTO TASK a
USING (SELECT b.task_date FROM TASK b)
ON (a.task_type = b.task_type)
WHEN NOT MATCHED THEN
[INSERT INTO TASK]
Run Code Online (Sandbox Code Playgroud)
或者应该是这样:
MERGE INTO TASK a
USING (SELECT b.task_date FROM TASK b)
ON (a.task_type = b.task_type)
WHEN MATCHED THEN
[]
WHEN MATCHED THEN
[INSERT INTO …Run Code Online (Sandbox Code Playgroud) 我正在编写一个查询来将数据从一个表导入到一个新表中.我需要插入新表中不存在的记录,并更新确实存在的记录.我正在尝试使用MERGE"upsert"方法.
由于客户端的数据库和应用程序结构,我有一些独特的问题.我插入的表有一个唯一ID字段,每个新行增加1,但表不执行自动递增; insert语句需要拉出目标表中的最高ID,并为新记录添加1.
根据我的研究,我无法弄清楚如何用MERGE做到这一点.我没有数据库权限来创建序列.我尝试了很多东西,但目前我的查询看起来像:
MERGE
dbo.targetTable as target
USING
dbo.sourceTable AS source
ON
target.account_no = source.account_ID
WHEN NOT MATCHED THEN
INSERT (
ID,
FIELD1,
FIELD2,
FIELD3
) VALUES (
(SELECT MAX(ID) + 1 FROM dbo.targetTable),
'field1',
'field2',
'field3'
)
Run Code Online (Sandbox Code Playgroud)
我遇到这个代码的问题是它似乎只运行一次新ID的select语句.也就是说,如果目标表中的最高ID是10,它将插入ID为11的每个新记录.这将无法正常工作,因为我收到
Violation of PRIMARY KEY constraint. Cannot insert duplicate key in object错误.我一直在做大量的谷歌搜索和尝试不同的东西,但无法弄清楚这一点.感谢任何帮助,谢谢.
编辑:为了澄清,唯一ID列不会自动填充.如果我没有为ID列插入值,我得到
Cannot insert the value NULL into column 'ID', table 'dbo.targetTable'; column does not allow nulls. UPDATE fails.
而且,正如我最初提到的,我没有创建序列的权限.它只是抛出一个错误,并说我没有这样做的许可.
我同意将ID列自动更改为自动增量是完美的,但我没有能力像这样修改表格.
Merge和SQL Server中的合并连接有什么区别?
我有这样的sql语句:
MERGE pvl.testTable AS T
USING temp.testTable AS S
ON (T.Id = S.ID)
WHEN NOT MATCHED BY TARGET THEN
INSERT (first,
second,
third,
fourth) VALUES (s.first,
s.second,
s.third,
s.fourth)
WHEN MATCHED
THEN
UPDATE
SET
T.first = S.first,
T.second = S.second,
T.third = S.third,
T.fourth = S.fourth
WHEN NOT MATCHED BY SOURCE
THEN
DELETE;
Run Code Online (Sandbox Code Playgroud)
我也知道我必须使用 ON CONFLICT,但是我如何处理“WHEN NOT MATCHED BY TARGET”和“WHEN NOT MATCHED BY SOURCE”?
我在目标表上有两个后触发器(一个用于插入,一个用于更新).现在,如果我在目标表上执行merge,则触发器只执行一次.虽然merge语句执行大约300次更新和200次插入.
在从删除的,插入的记录到变量的数据之后,我在每个触发器中使用print语句检查它.
怎么会?这是一个错误吗?
我有SQL Server 2008 sp1 std(SBS2k8的一部分).
我一直在尝试编写一个存储过程,我可以使用Merge和以下条件执行UpSert
如果记录存在,则将目标的EndDate更改为昨天的日期,即当前日期 - 1
如果Record不存在,则插入新记录
这是我在SP中使用的表tblEmployee
CREATE TABLE tblEmployee
(
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](10) NOT NULL,
[StartDate] [date] NOT NULL,
[EndDate] [date] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
这是我的SP,它将UDTT作为输入参数
CREATE PROCEDURE [dbo].[usp_UpsertEmployees]
@typeEmployee typeEmployee READONLY -- It has same column like tblEmployye except EmployeeID
AS
BEGIN
SET NOCOUNT ON;
MERGE INTO tblEmployee AS TARGET
USING @typeEmployee AS SOURCE
ON TARGET.Name = SOURCE.Name
WHEN MATCHED and TARGET.StartDate < SOURCE.StartDate
THEN
--First Update Existing Record EndDate to Previous Date as shown below …Run Code Online (Sandbox Code Playgroud) 使用JdbcTemplate,我想调用MERGE SQL语句,该语句将向表中插入新记录,或者如果已经存在具有特定键的行,则更新该语句。关键部分是该列之一是Oracle BLOB类型。
这是我到目前为止尝试过的:
尝试1。
SQL语句:
String sql = ""
+ "MERGE INTO file_thumbnails "
+ " USING (SELECT ? as file_c_id, ? as thumbnail_type, ? as thumbnail_image FROM DUAL) tmp "
+ " ON (file_thumbnails.file_c_id = tmp.file_c_id AND "
+ " file_thumbnails.thumbnail_type = tmp.thumbnail_type) "
+ " WHEN MATCHED THEN "
+ " UPDATE "
+ " SET thumbnail_image = tmp.thumbnail_image "
+ " ,thumbnail_date = SYSDATE "
+ " WHEN NOT MATCHED THEN "
+ " INSERT (c_id, …Run Code Online (Sandbox Code Playgroud) sql-merge ×10
sql ×6
sql-server ×5
oracle ×3
blob ×1
concurrency ×1
contention ×1
jdbctemplate ×1
oracle11g ×1
postgresql ×1
primary-key ×1
spring ×1
sql-delete ×1
t-sql ×1
upsert ×1