代码之家  ›  专栏  ›  技术社区  ›  hitek

经典数据库插入问题

  •  1
  • hitek  · 技术社区  · 17 年前

    我有一个SQL数据库,用来存储一些信息,每条记录都有一个由数据库生成的唯一id。我的程序是用flash编写的,可以在网上运行,程序运行良好,它将记录插入数据库,并提取最后一条记录的id号并显示给用户,我的问题是,我该如何处理多个并发条目,因为程序将由多个用户使用,并且很可能会同时插入数据库,所以我如何为用户识别正确的唯一id号

    这是插入数据库的代码

    $query = "INSERT into $tablename (grade,school,country) VALUES ('$datarray[0]','$datarray[1]','$datarray[2]')";
    $result = mysql_query($query) 
            or die("no rows selected");
    

    之后,我在flash文件中的第二个php文件上加载另一个php文件,以获取该记录的id,并在下面显示代码

    $query = "SELECT max(id) from $tablename";
    $result = mysql_query($query) 
            or die("no rows selected");
    $row = mysql_fetch_array($result); // extracts one row
    echo  "id=$row[0]";
    

    我需要做什么才能获得该记录的正确id?

    11 回复  |  直到 17 年前
        1
  •  4
  •   Powerlord    17 年前

    PHP有 mysql_insert_id() 返回

    为生成的ID AUTO_INCREMENT 上一个INSERT查询的列 成功,如果前一个查询成功,则为0 不生成 AUTO_INCREMENT 价值, 或 FALSE 如果没有MySQL连接 成立。

        2
  •  3
  •   LicenseQ    17 年前

    大多数数据库支持UUID/GUID键。使用后端(甚至ActionScript)生成它,并在数据库中使用。它不是自然密钥,但即使在服务器场中,它也非常适合唯一性。

        3
  •  2
  •   Michaël Carpentier    17 年前

    您可以在同一事务中执行插入和后续选择操作。 您还可以根据您的数据库访问设施。

        4
  •  1
  •   Ray Booysen    17 年前

    如果您的数据库代码返回最后插入行的Id,这肯定会导致问题。

    如果你使用的是SQL server,你可以使用:

    SELECT SCOPE_IDENTITY()

    要重新选择正确的Id,请访问 MSDN article .

    如果你能提供更多关于如何插入数据库以及使用什么技术的信息,那将很有帮助

        5
  •  1
  •   Paul Tomblin    17 年前

    您需要一种原子方法来为插入内容获取唯一的id。经典的方法是使用数据库序列,在数据库中查询下一个唯一编号,然后在插入时使用该编号作为主键,或者(如果您使用的MySQL在插入时生成唯一编号)将插入和选择组合到一个原子语句中。

        6
  •  0
  •   Jim Petkus    17 年前

    这在一定程度上取决于您使用的数据库。

    例如,在SQL Server中,您有几个选项。您可以使用SCOPE-IDENTITY()来检索在当前作用域中创建的最后一个标识值。

    例如:选择@NEWID=SCOPE_IDENTITY()

    本文给出了SQL Server的一些示例:

    http://databases.aspfaq.com/general/how-do-i-get-the-identity/autonumber-value-for-the-row-i-inserted.html

        7
  •  0
  •   Gambrinus    17 年前

    使用事务——我个人不会用flash写(但这是我个人的想法)。不幸的是,我没有在flash中做过这样的事情——所以我不知道该语言是否支持事务——你能做的就是在数据库上使用事务。我的意思是,对于你建立的每个连接——你打开一个事务,在这个事务中只有一个用户——所以你有正确的id可以显示——但如果你使用自动递增的数字作为id,你仍然会遇到同样的问题——因为事务可以并发运行。我希望这能有所帮助;)

        8
  •  0
  •   Chris Nava    17 年前

    确保将INSERT和SELECT语句放入 单一查询 插入数据并返回ID。

    重要的是不要使用两个单独的查询来检索ID,因为一旦第一个插入完成,另一个用户就可以( 最终会 )在获得第一条记录的ID之前插入另一条记录。

    如果您使用单独的交易,您将 最后 有以下情况:

    User1 : Inserts a record (id = 123)
    User2 : Inserts a record (id = 124)
    User1 : Requests max id (and gets back 124) <---- WRONG ID
    User2 : Requests max id (and gets back 124)
    

    如上述帖子所述,检索插入ID的确切语法是特定于数据库的。

        9
  •  0
  •   Erik Nedwidek    17 年前

    首先,你正在使用PHP和MySQL。ID列通常应定义为:

    id int( 4 ) UNSIGNED NOT NULL AUTO_INCREMENT,
    -- Constraints
    primary key (id)
    

    使用id作为名称是自我记录的。一个4字节的整数可能有点过头了,尤其是因为它是无符号的,但空间很便宜,而且你不太可能用完id。

    我还建议尽可能使用InnoDB引擎。外键和数据完整性是美妙的东西。

    你的脚本应该执行mysql_connect(),这意味着每个用户都将获得自己的数据库连接,因为每个用户的会话都是该脚本的单独实例。插入后,您可以使用mysql_insert_id()来获取为插入生成的id,正如前面的海报所指出的那样。

        10
  •  0
  •   Steven A. Lowe    17 年前
    insert ....; select last_insert_id()
    
        11
  •  -1
  •   Zabbala    17 年前

    您可以将id与Users相关联,以便表中的主键是复合的(生成的唯一id,用户id)。