我认为我的问题非常简单,但网上的每次搜索都会向我显示有关SQL索引的结果。
我使用以下SQL查询来创建一个简单的表:
CREATE TABLE SpeechOutputList
(
ID int NOT NULL IDENTITY(1,1),
SpeechConfigCode nvarchar(36) NOT NULL,
OutputSentence nvarchar(500),
IsPrimaryOutput bit DEFAULT 0,
PRIMARY KEY(ID),
FOREIGN KEY(SpeechConfigCode)
REFERENCES SpeechConfig
ON UPDATE CASCADE ON DELETE CASCADE
);
我想添加一个自动增加的索引列(不是identity(1,1)
),它始终具有从1到N的值(根据行数)。
identity(1,1)
不会这样做,因为很多情况下没有从1到N的连续数字,因为它是用于主键的。
由于
答案 0 :(得分:1)
尝试保持这样的索引字段顺序,没有间隙,效率不高。例如,如果删除了记录,则需要使用触发器重新编号后面的记录。这不仅需要额外的时间,还会降低并发性。
此外,该索引不是记录的稳定密钥。如果客户端获取记录的索引值,然后稍后将尝试通过该索引再次找到它,那么它可能会得到不同的记录。
如果您仍然认为这样的索引很有用,我建议您创建一个即时添加此索引的视图:
CREATE VIEW SpeechOutputListEx AS
SELECT ID, SpeechConfigCode, OutputSentence, IsPrimaryOutput,
ROW_NUMBER() OVER (ORDER BY ID ASC) AS idx
FROM SpeechOutputList
这样就可以进行选择,例如:
SELECT * FROM SpeechOutputListEx WHERE idx = 5
要使用索引条件进行更新,您可以使用视图进行连接:
UPDATE s
SET OutputSentence = 'sentence'
FROM SpeechOutputList s
INNER JOIN SpeechOutputListEx se
ON s.ID = se.ID
WHERE idx = 5
您在评论中解释说,该命令应指明一个句子是否是主要的。
为此,您不需要视图。您可以添加列idx
,这将允许间隙。然后让用户确定idx
列的值。即使是否定的,这也不是问题。您可以按idx
值的顺序进行选择,因此首先获得主要句子。
如果必须将某个句子设为 primary ,您可以发出此更新:
update SpeechOutputList
set idx = (select min(idx) - 1 from SpeechOutputList)
where id = 123