重复键

时间:2017-11-15 00:38:27

标签: sql sql-server database

在SQL Server中,我有一个只有一个主键的表,但如果存在一组列(非主要的),我需要InsertUpdate

我知道桌面上的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生成了一条新记录,我将其插入到表格中,因为组合(user2email_C)并非如此。存在。

但如果它usr2email_B一起,那么我会将textA更新为textB,因为存在一个包含组合的记录({{1} },user2

2 个答案:

答案 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)

  1. 您可以在键列上创建唯一索引,并将IGNORE_DUP_KEY选项设置为on。例如,这将导致在INSERT操作期间忽略重复的行。但是,您必须通过插入另一个表然后执行更新
  2. 来更新行
  3. 使用工作表方法将所有行插入工作表,然后将insert / update用作主表。