【问题标题】:How to maintain如何保养
【发布时间】:2016-11-04 16:56:17
【问题描述】:

我想知道 SQL Server(即 T-SQL 语言)是否有这样做的自然方式,或者我是否必须编写花哨的约束/触发器。

假设我有一张桌子

       RebuplicanCandidates
===================================
 Id |      Name       | ByteIndex
===================================
 1  | 'Marco Rubio'   |    0
 2  | 'Jeb Bush'      |    1
 3  | 'Donald Trump'  |    2
 4  | 'Ted Cruz'      |    3

然后我删除 JebBush:

DELETE FROM [RepublicanCandidates] WHERE [Id]=2

那么我希望桌子像

       RebuplicanCandidates
===================================
 Id |      Name       | ByteIndex
===================================
 1  | 'Marco Rubio'   |    0
 3  | 'Donald Trump'  |    1
 4  | 'Ted Cruz'      |    2

请注意,ByteIndex 列已洗牌。

然后如果我插入一个候选人

INSERT INTO [RepublicanCandidates] (Name) VALUES ('CarlyFiorina') 

桌子变成了

       RebuplicanCandidates
===================================
 Id |      Name       | ByteIndex
===================================
 1  | 'Marco Rubio'   |    0
 3  | 'Donald Trump'  |    1
 4  | 'Ted Cruz'      |    2
 5  | 'Carly Fiorina' |    3

【问题讨论】:

  • ehm....插入的行发生了什么?
  • @Lamak 哎呀,你去
  • 为什么要存储一个没有间隙的ByteIndex?删除第一行意味着必须更新表中的所有其他行。
  • 如果您基于表创建了一个视图,您可以添加一个 row_number() 函数而不是 ByteIndex 列。
  • 我想知道在数据库中有一个 unstable 编号 RebuplicanCandidates [sic] 有什么价值?应用程序显示分配了密集(?!)数字的候选人可能很有用,但这是应用程序的问题。如果不保留流浪价值观的完整历史并知道何时对“14”感兴趣,您将无法返回并确定谁是“14”(以及他们是否会向您出售披萨)。

标签: sql sql-server tsql database-design


【解决方案1】:

如果您基于该表创建了一个 VIEW,您可以添加一个 row_number() 函数,并从基表中删除 ByteIndex 列。

CREATE VIEW vRebuplicanCandidates
AS

SELECT id, name , ROW_NUMBER() OVER (ORDER BY id) - 1 AS ByteIndex
FROM RebuplicanCandidates

【讨论】:

  • 但是 ROW_NUMBER() 不保证行的任何特定顺序。
【解决方案2】:

T-SQL 无法满足您的要求。您将不得不编写一些代码或其他答案中的建议是一个很好的恕我直言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多