在SQL Server中,我有一个只有一个主键的表,但如果存在一组列(非主要的),我需要Insert
或Update
。
我知道桌面上的composed keys
- multiple keys
,但我不能alter
表格。
有没有办法在单个查询上执行此操作,可能是on duplicate key
功能的变量?或者应该解决几个问题?
例如:
Table_Name:Contacts
列:
id (int) PK
Name (vc30)
usrName (vc20)
Email (vc30)
Pass (vc15)
otherUsrData (...)
约束应为(usrName,Email)
你可以拥有相同的usrName
,每个emails
不同,usrName
具有相同的email
(我知道这听起来不合逻辑,但它只是一个例如)
1 - usr1 - email_A@example.com - textA
2 - usr1 - email_B@example.com - textA
3 - usr2 - email_A@example.com - textA
4 - usr2 - email_B@example.com - textA
因此,使用usr2
和电子邮件email_C
生成了一条新记录,我将其插入到表格中,因为组合(user2
,email_C
)并非如此。存在。
但如果它usr2
与email_B
一起,那么我会将textA
更新为textB
,因为存在一个包含组合的记录({{1} },user2
)
答案 0 :(得分:1)
我认为您可以使用MERGE
- 声明
DECLARE
@usrName varchar(20)='usr1',
@Email varchar(30)='email_A@example.com',
@Pass varchar(15)='111';
-- update test
MERGE Contacts trg
USING
(
SELECT
@usrName NewUsrName,
@Email NewEmail,
@Pass NewPass
) src
ON trg.usrName=src.NewUsrName AND trg.Email=src.NewEmail
WHEN MATCHED THEN
UPDATE SET
trg.Pass=src.Newpass
WHEN NOT MATCHED BY TARGET THEN
INSERT(usrName,Email,Pass)
VALUES(src.NewUsrName,src.NewEmail,src.NewPass);
SELECT *
FROM Contacts;
SET @usrName='usr1';
SET @Email='QQQ@example.com';
SET @Pass='222';
-- insert test
MERGE Contacts trg
USING
(
SELECT
@usrName NewUsrName,
@Email NewEmail,
@Pass NewPass
) src
ON trg.usrName=src.NewUsrName AND trg.Email=src.NewEmail
WHEN MATCHED THEN
UPDATE SET
trg.Pass=src.Newpass
WHEN NOT MATCHED BY TARGET THEN
INSERT(usrName,Email,Pass)
VALUES(src.NewUsrName,src.NewEmail,src.NewPass);
SELECT *
FROM Contacts;
答案 1 :(得分:0)