【发布时间】:2020-06-30 02:46:35
【问题描述】:
这种情况没有意义。
我的 php 代码中有以下 SQL 操作序列:
DROP TABLE IF EXISTS tablename;
CREATE TABLE tablename;
当然 php 代码看起来不是那样的,但那些是正在执行的命令。
每隔一段时间在 CREATE 语句上,系统会返回“表已存在”。
我认为这不会发生,除非它是在下降中的某种延迟。该表是 Innodb,我读到可能有进程使用该表。但是,表名中嵌入了用户的 session_id,因为该表有些临时性,并且仅专用于特定用户 - 没有其他用户可以使用该表,甚至任何其他脚本都不能使用它。它是一个“特定于用户、特定于脚本”的表。但是,用户可能会执行此脚本,转到另一个脚本,然后再返回此脚本。
describe 代码在一个例程中,它决定是否可以重新使用表,或者是否必须重新创建它。如果必须重新创建,则执行这两行。
任何想法是什么导致了这种错误情况?
编辑:
“实际代码”的问题在于,有时它只会导致更多与实际问题不同的问题。不过,这里是实际脚本的副本:
$query1 = "DROP TABLE IF EXISTS {$_SESSION['tmpContact']}";
SQL($query1);
$memory_table = "CREATE TABLE {$_SESSION['tmpContact']}";
SQL() 函数执行命令并进行错误处理。
【问题讨论】:
-
如果我们能看到真正发生的事情,评论会更容易。伪代码只能获得猜测
-
这个错误是否总是发生,或者您是否有更多关于它发生的特定场景的详细信息?如果有多个请求进入,并发性是否会成为潜在问题?
-
您不应该丢弃并重新创建一个被锤击过的表。如果需要,将数据移动到另一个表然后删除旧数据会更容易。
-
@totalhack 我也在考虑并发,但他说每个会话的表名都是唯一的。
-
你能用
CREATE TABLE IF NOT EXISTS tablename吗?
标签: mysql mariadb create-table drop-table