【问题标题】:Mysql drop table/create table sequence gives strange errorMysql drop table/create table 序列给出奇怪的错误
【发布时间】: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


【解决方案1】:

A 计划:检查DROP 之后的错误。那里可能有线索。

Plan B:CREATE TEMPORARY TABLE ...——这将是本地连接,所以[大概]你不需要DROP

【讨论】:

  • 临时表不符合要求,因为它是我们想闲逛一段时间的表。不过我们可以更改设计,以免它闲置,这只意味着它必须根据需要重新创建。
【解决方案2】:
$a = mysql_query("SELECT TABLE");
if($a != ''){}else{}

尝试将 php 与 sql 混合。

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2021-05-15
    • 2019-01-22
    • 2013-03-04
    相关资源
    最近更新 更多