避免插入 SQL 服务器上的唯一冲突
Avoid unique conflicts on insert SQL SERVER
我正在尝试插入一个对 (ProductType, ProductOwnerid) 具有唯一约束的 table,当该键已经存在时,不会触发违反约束的方式。所以我有这个 SQL 按预期工作:
INSERT INTO dbo.Products (ProductType, ProductOwnerId)
SELECT TOP 1 22, 44 FROM dbo.products prods
WHERE NOT EXISTS (
SELECT prods2.ProductType FROM dbo.products prods2
WHERE prods2.ProductType = 22 AND prods2.ProductOwnerId = 44)
这样好吗 SQL 或者我该如何改进它?我不是 TOP 1 的忠实粉丝,我怎样才能使它 readable/better 表现更好?
MERGE 语句是 SQL 处理此类情况的标准方法。
A relational database management system uses SQL MERGE (also called
upsert) statements to INSERT new records or UPDATE existing records
depending on whether or not a condition matches. It was officially
introduced in the SQL:2003 standard, and expanded in the SQL:2008
standard.
它比您的解决方案稍微冗长一点,但我发现它更具可读性。此外,代码的意图非常明确,因为 MERGE 语句专门处理这种情况。
CREATE TABLE products (
ProductId INT IDENTITY(1, 1),
ProductType int, ProductOwnerId INT,
CONSTRAINT [unq_type_owner] UNIQUE (ProductType, ProductOwnerId)
);
MERGE INTO dbo.products p
USING (VALUES (22, 44)) AS source(ProductType, ProductOwnerId)
ON p.ProductType = source.ProductType AND p.ProductOwnerId = source.ProductOwnerId
WHEN NOT MATCHED THEN
INSERT (ProductType, ProductOwnerId)
VALUES (source.ProductType, source.ProductOwnerId)
-- OPTIONAL OUTPUT
OUTPUT $action, Inserted.* ;
在此查询中,distinct 也可以代替 top 1
INSERT INTO dbo.Products (ProductType, ProductOwnerId)
SELECT DISTINCT 22, 44
FROM dbo.products prods
WHERE NOT EXISTS (SELECT prods2.ProductType
FROM dbo.products prods2
WHERE prods2.ProductType = 22 AND prods2.ProductOwnerId = 44)
我正在尝试插入一个对 (ProductType, ProductOwnerid) 具有唯一约束的 table,当该键已经存在时,不会触发违反约束的方式。所以我有这个 SQL 按预期工作:
INSERT INTO dbo.Products (ProductType, ProductOwnerId)
SELECT TOP 1 22, 44 FROM dbo.products prods
WHERE NOT EXISTS (
SELECT prods2.ProductType FROM dbo.products prods2
WHERE prods2.ProductType = 22 AND prods2.ProductOwnerId = 44)
这样好吗 SQL 或者我该如何改进它?我不是 TOP 1 的忠实粉丝,我怎样才能使它 readable/better 表现更好?
MERGE 语句是 SQL 处理此类情况的标准方法。
A relational database management system uses SQL MERGE (also called upsert) statements to INSERT new records or UPDATE existing records depending on whether or not a condition matches. It was officially introduced in the SQL:2003 standard, and expanded in the SQL:2008 standard.
它比您的解决方案稍微冗长一点,但我发现它更具可读性。此外,代码的意图非常明确,因为 MERGE 语句专门处理这种情况。
CREATE TABLE products (
ProductId INT IDENTITY(1, 1),
ProductType int, ProductOwnerId INT,
CONSTRAINT [unq_type_owner] UNIQUE (ProductType, ProductOwnerId)
);
MERGE INTO dbo.products p
USING (VALUES (22, 44)) AS source(ProductType, ProductOwnerId)
ON p.ProductType = source.ProductType AND p.ProductOwnerId = source.ProductOwnerId
WHEN NOT MATCHED THEN
INSERT (ProductType, ProductOwnerId)
VALUES (source.ProductType, source.ProductOwnerId)
-- OPTIONAL OUTPUT
OUTPUT $action, Inserted.* ;
在此查询中,distinct 也可以代替 top 1
INSERT INTO dbo.Products (ProductType, ProductOwnerId)
SELECT DISTINCT 22, 44
FROM dbo.products prods
WHERE NOT EXISTS (SELECT prods2.ProductType
FROM dbo.products prods2
WHERE prods2.ProductType = 22 AND prods2.ProductOwnerId = 44)