這是一個簡單的表定義:
CREATE TABLE UserNotificationTokens (
UserID INT NOT NULL,
Token CHAR(36) NOT NULL,
DeviceId VARCHAR(50) NOT NULL,
CONSTRAINT UC_DeviceId UNIQUE (DeviceId)
)
此處,DeviceId 列代表物理設備(智能手機)。對于每個設備,用戶都有一個令牌(只是一個字串,沒什么大不了的)。如您所見,DeviceId 列上有一個唯一鍵。如果此設備 (DeviceId) 不存在,我想為設備插入一個新令牌。我可以通過幾種方式檢查這種存在。但是,關鍵是 SQL Server 已經檢查 DeviceId 是否由于Unique Key而唯一。這意味著,同一任務有雙重作業。忽略我自己的檢查并將其留給 SQL Server 是一個好習慣嗎?如果插入將導致錯誤代碼為 2601(違反唯一鍵約束),則表示 DeviceId 已經存在。抓住這個特定的錯誤,什么都不做。否則,該行已成功插入。
uj5u.com熱心網友回復:
嗯,有 3 種不同的方法來做到這一點。都各有千秋。
- 檢查,然后插入。在一次交易中。這需要時間(2 個命令,到資料庫的 2 次往返)從而消除吞吐量,尤其是當您需要表鎖以確保其 100% 準確時。
- 使用合并陳述句一次性寫入更改。是的,可行。
- 只需插入并捕獲例外。
我會和后者一起去。它是最快的 - 只有一次往返,沒有表鎖定,沒有服務器延遲)并且捕獲例外很快。
你怎么做真的取決于復雜性 - 有時將簡單的事情卸載到資料庫才是最有意義的。
uj5u.com熱心網友回復:
您可以使用插入忽略:
例子:
INSERT IGNORE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
僅當它是唯一的時才會插入使用此查詢的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/380120.html
標籤:sql sql-server 表现 查询语句
下一篇:SQL查詢結果上的SED
