根据表中最近创建的行查找值(SQL Server)

时间:2016-04-21 14:33:37

标签: sql sql-server

对于一个完整的解决方案来说,这可能是一个太大的问题,而且我有一个奇怪的设置。我正在使用HP OO来创建一个基于文本的RPG,以练习在这个平台上习惯数据库设计。

所以它基本上是一个运行一次的流脚本。当脚本启动时,创建一个播放器(用户),然后创建一个角色。玩家输入其角色的名称,并存储在character表中。然后我用SELECT name FROM character WHERE character.character_id=x调用该字符名称。如何从正确(最近创建的)字符中检索名称。 character_id是一个自动递增的标识列。

3 个答案:

答案 0 :(得分:4)

没有保证标识列中的最高值是最近创建的记录。您应该在表格中添加date_created列,并为其指定当前日期和时间的默认值(current_timestamp字段为datetime2)。这实际上做了你想要的。

好的,你的问题有所改变,Tab的评论也是正确的。如果您要插入并获取插入的身份,则应该关注他链接的the advice here

但是,如果您希望能够确定创建顺序 - 这是您最初提出的要求 - 那么您应该使用date_created字段。可以绕过IDENTITY并插入您想要的任何值,UPDATE和DELETE之类的东西也可以改变。从本质上讲,将IDENTITY列的记录值相对于表中的其他记录赋值(即,这是在这些其他记录之前或之后创建的)是一个坏主意,因为您实际上可以绕过这一点。

就个人而言,我会使用OUTPUT子句让我的INSERT发回ID:

INSERT INTO Character (...)
OUTPUT INSERTED.Id
VALUES (....);

或者我重复使用相同的连接并返回SCOPE_IDENTITY()

INSERT INTO Character (...)
VALUES (....);

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];

答案 1 :(得分:1)

SELECT row FROM table WHERE id=(
    SELECT max(id) FROM table
    )
this should work

确保ID是唯一的(自动递增?太棒了!)

答案 2 :(得分:0)

当您插入字符表时,您应该依赖Scope_Identity()@@Identity(取决于您的数据库的设置方式。阅读更多相关信息here)以返回唯一ID (表中自动递增的ID),并使用前进的那个。

以其他任何方式执行此操作可以解决数据完整性问题。