SQL索引列的值始终为1到N.

时间:2016-04-30 08:35:45

标签: sql sql-server

我认为我的问题非常简单,但网上的每次搜索都会向我显示有关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的连续数字,因为它是用于主键的。

由于

1 个答案:

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