2009-02-06 239 views
1

我有一个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"); 
代码

之后,我加载另一个PHP文件在我的Flash文件中的第二个拉该记录的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?

+0

哪个数据库引擎? – kemiller2002 2009-02-06 15:10:03

回答

4

PHP有mysql_insert_id()返回

用于AUTO_INCREMENT 列生成由先前INSERT查询上 成功,0的ID如果先前的查询并 不会产生AUTO_INCREMENT值, 或FALSE如果没有建立MySQL连接是 。

1

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

如果您正在使用SQL Server,你可以使用:

SELECT SCOPE_IDENTITY()

选择回到正确的ID。更多信息,请致电MSDN article

,如果你给你如何做你的数据库插入和什么样的技术你使用

+0

这个问题似乎是使用MySQL,没有MSSQL。 – Powerlord 2009-02-06 15:25:53

+0

是的,我现在看到这个,他第一次问的时候并不明显。 – 2009-02-06 15:36:37

2

你可以做你插入和下面的选择操作到同一个交易的更多信息这将是有益的。 您也可以根据您的数据库访问设施。

+0

将插入和查询合并到一个SP中 - 这使得事务更容易使用。 – Arkadiy 2009-02-06 16:25:48

-1

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

+0

如果用户有两个窗口打开? – 2009-02-06 15:13:29

1

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

0

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

3

大多数数据库都支持UUID/GUID键。用后端(甚至是ActionScript)生成它并在数据库中使用它。这不是天然的关键,但即使在服务器农场内,它也是独一无二的完美选择。

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确切的语法上面的帖子指出的是DB具体。

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。

0
insert ....; select last_insert_id()