1

我有一个 SQL 数据库,用于存储一些信息,每条记录都有一个由数据库生成的唯一 ID。我的程序是用闪存编写的并在网络上运行,程序运行良好,它将记录插入数据库并提取最后一条记录的 idnumber 并将其显示给用户,我的问题是我如何处理多个并发条目,因为程序将被多个用户使用,并且可能会有并发插入到数据库中,所以我如何能够为用户识别正确的唯一 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文件以提取该记录的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?

4

11 回答 11

4

PHP必须mysql_insert_id()返回

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

于 2009-02-06T15:27:26.337 回答
3

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

于 2009-02-06T15:26:18.647 回答
2

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

于 2009-02-06T15:11:52.623 回答
1

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

如果您使用的是 SQL 服务器,则可以使用:

SELECT SCOPE_IDENTITY()

选择回正确的 ID。有关MSDN 文章的更多信息。

如果您提供有关如何进行数据库插入以及您使用的技术的更多信息,将会很有帮助

于 2009-02-06T15:11:25.790 回答
1

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

于 2009-02-06T15:12:01.110 回答
0

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

例如,在 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

于 2009-02-06T15:12:02.560 回答
0

使用交易——我个人不会在闪存中写它(但这是我个人的意见)。不幸的是,我没有在 Flash 中做过这样的事情——所以我不知道该语言是否支持事务——你可以做的是在数据库上使用事务。我的意思是对于您建立的每个连接-您打开一个事务并且在该事务中只有一个用户-因此您可以显示正确的ID-但是如果您使用自动递增的数字作为ID,您将仍然拥有相同的ID问题 - 因为事务可以并发运行。我希望这个能有一点帮助 ;)

于 2009-02-06T15:12:12.090 回答
0

请务必将 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 的确切语法是特定于数据库的。

于 2009-02-06T16:01:46.173 回答
0

首先,您使用的是 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。

于 2009-02-06T16:36:04.403 回答
0
insert ....; select last_insert_id()
于 2009-02-06T17:41:57.763 回答
-1

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

于 2009-02-06T15:11:58.863 回答