Php 在Sql Server中插入或更新多行
我需要执行如下所示的查询。列KEY1和KEY2是不能重复的键。如果有匹配的键,我需要执行更新VAL而不是插入。如何在Sql Server中实现这一点Php 在Sql Server中插入或更新多行,php,sql,sql-server,Php,Sql,Sql Server,我需要执行如下所示的查询。列KEY1和KEY2是不能重复的键。如果有匹配的键,我需要执行更新VAL而不是插入。如何在Sql Server中实现这一点 INSERT INTO tableA ( KEY1, KEY2, VAL, ) VALUES ( -- Row A 'datakeyA1', 'datakeyA2', 'somev
INSERT INTO tableA
(
KEY1,
KEY2,
VAL,
) VALUES (
-- Row A
'datakeyA1',
'datakeyA2',
'somevaluetoinsertorupdate'
) , (
-- Row B
'datakeyB1',
'datakeyB2',
'somevaluetoinsertorupdate'
) , (
-- Row C
'datakeyC1',
'datakeyC2',
'somevaluetoinsertorupdate'
);
我尝试过使用MERGE,但从语法上看,我不确定它是否支持更新/插入多行。如果有人在过去遇到过类似的情况,你能帮忙吗
编辑:
如果我使用的是MySql,我会使用:
ON DUPLICATE KEY UPDATE
VAL = VALUES(VAL)
在查询中。您可以使用a作为源表,以便使用MERGE
:
MERGE tableA AS t
USING (VALUES
('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate'),
('datakeyB1', 'datakeyB2', 'somevaluetoinsertorupdate'),
('datakeyC1', 'datakeyC2', 'somevaluetoinsertorupdate')
) AS s (Key1, Key2, Val)
ON s.Key1 = t.Key1
AND s.Key2 = t.Key2
WHEN MATCHED THEN
UPDATE
SET Val = s.Val
WHEN NOT MATCHED THEN
INSERT (Key1, Key2, Val)
VALUES (s.Key1, s.Key2, s.Val);
试着像这样使用合并: MS SQL Server 2008架构设置:
CREATE TABLE tableA
(
KEY1 VARCHAR(50),
KEY2 VARCHAR(50),
VAL VARCHAR(50)
PRIMARY KEY (Key1, Key2)
)
INSERT INTO tableA
VALUES ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate')
MERGE tableA AS T
USING
(VALUES ('datakeyA1','datakeyA2','SOME NEW VALUE'),
('datakeyB1','datakeyB2','somevaluetoinsertorupdate'),
('datakeyC1','datakeyC2','somevaluetoinsertorupdate')) AS S(Key1, Key2, Val)
ON (S.Key1 = T.Key1 AND S.Key2 = T.Key2)
WHEN MATCHED
THEN UPDATE SET T.Val = S.Val
WHEN NOT MATCHED BY TARGET
THEN INSERT (Key1, Key2, VAL) VALUES (S.Key1, S.Key2, S.Val);
SELECT *
FROM tableA
| KEY1 | KEY2 | VAL |
|-----------|-----------|---------------------------|
| datakeyA1 | datakeyA2 | SOME NEW VALUE |
| datakeyB1 | datakeyB2 | somevaluetoinsertorupdate |
| datakeyC1 | datakeyC2 | somevaluetoinsertorupdate |
查询1:
CREATE TABLE tableA
(
KEY1 VARCHAR(50),
KEY2 VARCHAR(50),
VAL VARCHAR(50)
PRIMARY KEY (Key1, Key2)
)
INSERT INTO tableA
VALUES ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate')
MERGE tableA AS T
USING
(VALUES ('datakeyA1','datakeyA2','SOME NEW VALUE'),
('datakeyB1','datakeyB2','somevaluetoinsertorupdate'),
('datakeyC1','datakeyC2','somevaluetoinsertorupdate')) AS S(Key1, Key2, Val)
ON (S.Key1 = T.Key1 AND S.Key2 = T.Key2)
WHEN MATCHED
THEN UPDATE SET T.Val = S.Val
WHEN NOT MATCHED BY TARGET
THEN INSERT (Key1, Key2, VAL) VALUES (S.Key1, S.Key2, S.Val);
SELECT *
FROM tableA
| KEY1 | KEY2 | VAL |
|-----------|-----------|---------------------------|
| datakeyA1 | datakeyA2 | SOME NEW VALUE |
| datakeyB1 | datakeyB2 | somevaluetoinsertorupdate |
| datakeyC1 | datakeyC2 | somevaluetoinsertorupdate |
:
CREATE TABLE tableA
(
KEY1 VARCHAR(50),
KEY2 VARCHAR(50),
VAL VARCHAR(50)
PRIMARY KEY (Key1, Key2)
)
INSERT INTO tableA
VALUES ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate')
MERGE tableA AS T
USING
(VALUES ('datakeyA1','datakeyA2','SOME NEW VALUE'),
('datakeyB1','datakeyB2','somevaluetoinsertorupdate'),
('datakeyC1','datakeyC2','somevaluetoinsertorupdate')) AS S(Key1, Key2, Val)
ON (S.Key1 = T.Key1 AND S.Key2 = T.Key2)
WHEN MATCHED
THEN UPDATE SET T.Val = S.Val
WHEN NOT MATCHED BY TARGET
THEN INSERT (Key1, Key2, VAL) VALUES (S.Key1, S.Key2, S.Val);
SELECT *
FROM tableA
| KEY1 | KEY2 | VAL |
|-----------|-----------|---------------------------|
| datakeyA1 | datakeyA2 | SOME NEW VALUE |
| datakeyB1 | datakeyB2 | somevaluetoinsertorupdate |
| datakeyC1 | datakeyC2 | somevaluetoinsertorupdate |
合并支持多行。为什么不呢?您是否正在尝试
批量插入/更新
当不匹配时,我尝试然后插入(KEY1,KEY2,VAL)值('datakeyA1','datakeyA1','datakeyA1'),('datakeyB1','datakeyB1','datakeyB1')代码>。这似乎是无效的语法。我试图插入多行,但正在研究如何在现有数据中找到匹配的键时进行更新而不是插入。(也就是说,与MySqlI中的重复密钥更新功能相同的功能是在一个查询中搜索更新多行的解决方案,就像在MyTable(a,b,c)中插入值(1,2,3),(3,4,5),[…]),这真的做到了。谢谢