检索具有字母数字键的数据库中的最后一条记录

时间:2011-05-15 13:57:25

标签: sql

我有一个存储视频游戏细节的数据库。表名是游戏&它的主键是'gameNo',它是字母数字(例如G1,G2,G3 ......等)。我想检索最后输入的游戏号码,以便在输入时为下一个游戏生成游戏号码。当我使用时,

this.cmd = new OleDbCommand("SELECT MAX(gameNo) FROM games",this.con.conObj());

我的结果不正确。例如,如果有像G2和&amp ;;这样的gameNo值。 G190,我想要检索G190,而不是G2。如有任何帮助,将不胜感激。我是学生&如果可能的话,一个好的解释也将是一个巨大的帮助。提前致谢。顺便说一下,我正在使用Visual C#。

3 个答案:

答案 0 :(得分:3)

这是将密钥存储为varchar列的结果。

我会从数字中分离出'G'并有两列。如果它总是'G',那么你甚至不需要两列。

此外,您还有另一个问题,即使用SELECT MAX(gameNo) FROM games获取最后一个游戏号码所导致的问题。如果此系统是多用户系统,则两个用户可以获得相同的号码。您没有提到您使用的数据库,但所有数据库都可以让您安全地获得游戏的唯一ID。

我会有一个类似的表(这是针对SQL Server的,但你会得到这个想法。

CREATE TABLE Games(
    GameID int IDENTITY(1,1),
    ...Other Columns,
    CONSTRAINT PK_Games PRIMARY KEY CLUSTERED(GameID))

然后,当您为游戏创建新行时,数据库将处理为您提供新的GameID。

答案 1 :(得分:0)

老实说,虽然肯定有解决方案来解析查询中的gameNo,但我强烈建议使用{{1}更改数据库模型以使用正确的自动递增主键。而是数据类型。

  1. 在我看来,一个字母数字的主键是糟糕的设计。
  2. 您完全不需要使用数据库配备的适当机制来自行生成主键。
  3. 如果同时创建多个游戏条目,则会避免“竞争条件”,这会导致尝试插入条目的其中一个进程发生PK违规。

答案 2 :(得分:0)

这里有几个问题。一个是因为gameNo是字母数字并不意味着 last 记录是最大的值。您必须详细说明此列中的值如何自动递增。另一个问题是什么是“最大”。使用字母数字,将值作为测试进行比较,而不是数字。所以,'3'将在'1a'之前出现。