经典数据库插入问题

时间:2009-02-06 15:06:51

标签: mysql concurrency insert

我有一个SQL数据库,用于存储一些信息,每个记录都有一个由数据库生成的唯一ID。我的程序是用flash编写的,并在网上运行,程序运行正常,它将记录插入数据库并提取最后一条记录的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?

11 个答案:

答案 0 :(得分:4)

PHP有mysql_insert_id()返回

  

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

答案 1 :(得分:3)

大多数数据库都支持UUID / GUID密钥。使用您的后端(甚至ActionScript)生成它并在数据库中使用它。这不是天生的关键,但即使在服务器场内,它也是完美的唯一性。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

如果您使用的是SQL Server,则可以使用:

SELECT SCOPE_IDENTITY()

选择返回正确的ID。有关更多信息,请访问MSDN article

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

EX:SELECT @NEWID = SCOPE_IDENTITY()

本文提供了SQL Server的一些示例:

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

答案 6 :(得分:0)

使用交易 - 我个人不会在flash中写它(但那是我个人的选择)。不幸的是,我没有在flash中做过这样的事情 - 所以我不知道是否有语言的事务支持 - 你可以做的是使用数据库上的事务。我的意思是你所做的每一个连接 - 你打开一个交易,在这个交易中只有一个用户 - 所以你有正确的id显示 - 但如果你使用自动递增的数字作为id,你仍然会有相同的问题 - 因为事务可以并发运行。我希望这有点帮助;)

答案 7 :(得分: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的确切语法是特定于数据库的。

答案 8 :(得分: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。

答案 9 :(得分:0)

insert ....; select last_insert_id()

答案 10 :(得分:-1)

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