我有一个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?
答案 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的一些示例:
答案 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)。