对于一个完整的解决方案来说,这可能是一个太大的问题,而且我有一个奇怪的设置。我正在使用HP OO来创建一个基于文本的RPG,以练习在这个平台上习惯数据库设计。
所以它基本上是一个运行一次的流脚本。当脚本启动时,创建一个播放器(用户),然后创建一个角色。玩家输入其角色的名称,并存储在character
表中。然后我用SELECT name FROM character WHERE character.character_id=x
调用该字符名称。如何从正确(最近创建的)字符中检索名称。 character_id
是一个自动递增的标识列。
答案 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),并使用前进的那个。
以其他任何方式执行此操作可以解决数据完整性问题。