【发布时间】:2008-11-06 06:43:43
【问题描述】:
我试图找出将记录插入单个表的最佳方法,但前提是该项目尚不存在。在这种情况下,KEY 是一个 NVARCHAR(400) 字段。对于这个例子,让我们假设它是牛津英语词典中的一个单词的名称/在此处插入您最喜欢的词典。另外,我猜我需要将 Word 字段设置为主键。 (该表也将具有唯一标识符 PK)。
所以..我可能会得到这些我需要添加到表中的词...
例如。
- 猫
- 狗
- 富
- 酒吧
- 皮尤
- 等等……
所以传统上,我会尝试以下(伪代码)
SELECT WordID FROM Words WHERE Word = @Word
IF WordID IS NULL OR WordID <= 0
INSERT INTO Words VALUES (@Word)
即。 如果单词不存在,则插入它。
现在 .. 我担心的问题是我们得到了很多点击 .. 那么这个词是否有可能从另一个进程中插入 SELECT 和 INSERT .. 然后会抛出约束错误? (即Race Condition)。
然后我认为我可以做到以下几点......
INSERT INTO Words (Word)
SELECT @Word
WHERE NOT EXISTS (SELECT WordID FROM Words WHERE Word = @Word)
基本上,插入一个不存在的单词。
抛开语法错误不谈,我不确定这是好是坏,因为它如何锁定表(如果是的话)并且在表上的性能不高,以至于它获得大量读取和大量写入。
那么 - 您的 Sql 专家认为/做什么?
我希望有一个简单的插入并“捕获”任何抛出的错误。
【问题讨论】:
标签: sql-server insert unique