mysql不能删除数据表

时间:2021-09-26 19:48:08
我用存储过程建的一个临时表,执行后删除不掉了,INNODB表。

23 个解决方案

#1




你的代码是什么?错误信息是什么,建议尽可能的提供信息,否则别人很难猜测你的问题是什么?

mysql> create temporary table t_temp(id int) engine=innodb;
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t_temp values (1);
Query OK, 1 row affected (0.05 sec)

mysql> select * from t_temp;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> drop table t_temp;
Query OK, 0 rows affected (0.05 sec)

mysql>


#2


可以删除,你的代码

#3


drop table pmc_worknolist;
错误为:
error 1051(42s02):unknow table "pmc_worknolist"

#4




你有这个表吗?!

临时表的生存期只是在session内,当你的connection断开后,这个临时表就会被MySQL自动删除。

#5


建表代码是什么?

#6


我在SQLyogEnt中能看到这个表,但是删除不掉,提示说没有这个表。
这是建表代码,放在存储过程中
DROP TABLE IF EXISTS PMC_WorkNoList;
CREATE TABLE PMC_WorkNoList(
  FInterID INT DEFAULT 1, #内码,排序用的
  FID INT NULL,
  FEntryID INT NULL,  #序列号
  FMethodID INT NULL,  #方法标号
  FWorkNo VARCHAR(45) NULL,    #工程单号
  FCustomerName VARCHAR(45) NULL,#客户
  FName VARCHAR(128)  NULL,   #物料名称
  FYSSL DECIMAL(28,10) NULL,        #订单实数
  FZDSS DECIMAL(28,10) NULL, #最低实数
  FBPSL DECIMAL(28,10) NULL, #本批数量
  FJGSL DECIMAL(28,10) NULL, #加工数量
  FDeliveryDate VARCHAR(128) NULL,    #交期
  FMadeWidth DECIMAL(28,10) NULL,  #开纸长
  FMadeLong DECIMAL(28,10) NULL,  #开纸宽
  FLevel VARCHAR(128) NULL,  #纸材
  FBang INT,  #磅数
  FSize VARCHAR(50) NULL,  #纸度
  FNote VARCHAR(256) NULL,
  FPlanHour DECIMAL(10,2),
  FColor VARCHAR(128) NULL
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
这个存储过程是有人在用的,是不是我上午我修改存储过程时候有人用了这个,然后出现错误了

#7




mysql不能删除数据表
楼主啊,你这可不叫"临时表"啊。 这不过是个普通表。

show tables 看一下有没有这个表 PMC_WorkNoList;?
然后检查一下数据库文件夹中有没有这个 PMC_WorkNoList.FRM

建议贴一下你的储存过程的代码。 仅从这个create table语句看不出什么。

#8


是一般的表嘛,直接DROP TABLE就可以了,估计这个表是被破坏了,你在目录中查找PMC_WorkNoList*。*

#9


show tables 有这个表
数据库文件夹下也有PMC_WorkNoList.FRM
代码如下:
DELIMITER $$

DROP PROCEDURE IF EXISTS `wincodb`.`P_GetBosCombinedBZ`$$

CREATE DEFINER=`root`@`%` PROCEDURE `P_GetBosCombinedBZ`($M_FOrder INT,$M_FDate VARCHAR(45),$M_FClassID INT)
BEGIN
DECLARE $T_FWorkNo VARCHAR(50) CHARACTER SET utf8;
DECLARE $T_FInterID,$maxCount,$j,$T_FMethodID,$T_FID INT;
#创建光标
DECLARE $done INT DEFAULT 0;
DECLARE PMC_CH CURSOR FOR
SELECT FWorkNo,FMethodID,FID
FROM PMC_WorkNoList
ORDER BY FEntryID;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET $done=1;
DROP TABLE IF EXISTS PMC_WorkNoList;
CREATE TABLE PMC_WorkNoList(
  FInterID INT DEFAULT 1, #内码,排序用的
  FID INT NULL,
  FEntryID INT NULL,  #序列号
  FMethodID INT NULL,  #方法标号
  FWorkNo VARCHAR(45) NULL,    #工程单号
  FCustomerName VARCHAR(45) NULL,#客户
  FName VARCHAR(128)  NULL,   #物料名称
  FYSSL DECIMAL(28,10) NULL,        #订单实数
  FZDSS DECIMAL(28,10) NULL, #最低实数
  FBPSL DECIMAL(28,10) NULL, #本批数量
  FJGSL DECIMAL(28,10) NULL, #加工数量
  FDeliveryDate VARCHAR(128) NULL,    #交期
  FMadeWidth DECIMAL(28,10) NULL,  #开纸长
  FMadeLong DECIMAL(28,10) NULL,  #开纸宽
  FClassName VARCHAR(128) NULL,  #纸料
  FPlanHour DECIMAL(10,2),
  FNote VARCHAR(256) NULL
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
IF($M_FDate='')THEN
  INSERT INTO PMC_WorkNoList(FWorkNo,FCustomerName,FName,FYSSL,FZDSS,FBPSL,FJGSL,FDeliveryDate,FMadeWidth,
  FMadeLong,FID,FEntryID,FMethodID,FNote,FClassName,FPlanHour)
  SELECT A.FBillNO,A.FCustomerName,A.FName,A.FYSSL,A.FZDSS,B.FBPSL,B.FJGSL,B.FDeliveryDate,A.FMadeWidth0,A.FMadeLong0
        ,B.FID,B.FEntryID,B.FMethodID,B.FNote,A.FlevelName,B.FPlanHour
  FROM WincoBosCombinedPmc A,WincoBosCombinedPmcEntry B
  WHERE(A.FBillNo=B.FWorkNo)AND(B.FOrder=$M_FOrder)AND(B.FMethodID!=2)
  ORDER BY B.FMethodID,B.FEntryID;
ELSE
  INSERT INTO PMC_WorkNoList(FWorkNo,FCustomerName,FName,FYSSL,FZDSS,FBPSL,FJGSL,FDeliveryDate,FMadeWidth,
  FMadeLong,FID,FEntryID,FMethodID,FNote,FClassName,FPlanHour)
  SELECT A.FBillNO,A.FCustomerName,A.FName,A.FYSSL,A.FZDSS,B.FBPSL,B.FJGSL,B.FDeliveryDate,A.FMadeWidth0,A.FMadeLong0
        ,B.FID,B.FEntryID,B.FMethodID,B.FNote,A.FlevelName,B.FPlanHour
  FROM WincoBosCombinedPmc A,WincoBosCombinedPmcEntry B
  WHERE(A.FBillNo=B.FWorkNo)AND(B.FOrder=$M_FOrder)AND(B.FDate=$M_FDate)AND(B.FMethodID!=2)
  ORDER BY B.FMethodID,B.FEntryID;
END IF;
SET $maxCount=0;
SET $j=0;
SELECT SUM(FInterID) INTO $maxCount FROM PMC_WorkNoList
WHERE(FMethodID!=2)
GROUP BY FInterID;
OPEN PMC_CH;
REPEAT
  FETCH PMC_CH INTO $T_FWorkNo,$T_FMethodID,$T_FID;
  IF NOT $done THEN
  IF($T_FMethodID=3)OR($T_FMethodID=4)THEN
    UPDATE PMC_WorkNoList
    SET FEntryID=$maxCount+1
    WHERE(FWorkNo=$T_FWorkNo)AND(FID=$T_FID);
    UPDATE WincoBosCombinedPmcEntry
    SET FEntryID=$maxCount+1
    WHERE(FWorkNo=$T_FWorkNo)AND(FID=$T_FID);
    SET $maxCount=$maxCount+1;
  ELSE
    UPDATE PMC_WorkNoList
    SET FEntryID=$j+1
    WHERE(FWorkNo=$T_FWorkNo)AND(FID=$T_FID);
    UPDATE WincoBosCombinedPmcEntry
    SET FEntryID=$j+1
    WHERE(FWorkNo=$T_FWorkNo)AND(FID=$T_FID);
    SET $j=$j+1;
  END IF;
  END IF;
UNTIL $done END REPEAT;
CLOSE PMC_CH;
IF( $M_FDate='')THEN
  SELECT A.FID,A.FEntryID,A.FMethodID,A.FWorkNo,A.FCustomerName,A.FName,A.FYSSL,A.FZDSS,
  A.FDeliveryDate,A.FMadeWidth,A.FMadeLong,A.FBPSL,A.FJGSL,A.FNote,A.FClassName,A.FPlanHour
  FROM  PMC_WorkNoList A,WincoBosCombinedPmcEntry B
  WHERE(A.FID=B.FID)AND(B.FClassID=$M_FClassID)  
  ORDER BY A.FEntryID,A.FDeliveryDate;
ELSE
  SELECT *  FROM  PMC_WorkNoList ORDER BY FEntryID,FDeliveryDate;
END IF;
DROP TABLE PMC_WorkNoList;
END$$

DELIMITER ;
执行的时候错误:Unknown table 'pmc_worknolist' 
将'pmc_worknolist'换成'pmc_worknolist1'后就无问题。
在过程中已经删除掉该表了,为什么在库中还有该表呢?弄不明白

#10




估计你的存储过程执行中异常中断了,没有执行drop table,

show table 有,.FRM文件也在,那试一下check table PMC_WorkNoList;;然后看一下系统的信息是什么?
如果可以就用repair tabel PMC_WorkNoList; 修复一下。然后再drop

#11


Table                 Op Msg_type    Msg_text
wincodb.pmc_worknolist check error     Table 'wincodb.pmc_worknolist' doesn't exist

#12


但执行repair tabel PMC_WorkNoList; 报错
错误码: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tabel PMC_WorkNoList' at line 1

#13


不好意思,table 字符输错了。
repair table PMC_WorkNoList;
drop table PMC_WorkNoList;
结果:
(1 row(s) returned)
Execution Time : 00:00:00:016
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:016

错误码: 1051
Unknown table 'pmc_worknolist'

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

#14




table
不好意思,拼写错了。
repair table xxx

#15




知道你的问题所在了,你的表是innodb存储引擎的,估计是你执行过程中出了什么异常。导致虽然在数据文件中的数据删除后,表的结构文件没有来得及或其它原因未能同时从操作系统中删除。

解决方法也很简单。直接到文件夹中把这个  PMC_WorkNoList.frm 删除即可。

#16


把my.ini中的
Inndb_force_recovery=1
强制不进行检查,但仍旧不行,真不知道该怎么做了?

#17


没人知道吗?

#18


搜索PMC_WorkNoList*.*
删除试试

#19




 15 ACMAIN_CHM :
知道你的问题所在了,你的表是innodb存储引擎的,估计是你执行过程中出了什么异常。导致虽然在数据文件中的数据删除后,表的结构文件没有来得及或其它原因未能同时从操作系统中删除。

解决方法也很简单。直接到文件夹中把这个  PMC_WorkNoList.frm 删除即可。


试一下看看结果。

#20


删除那个文件mysql会不会出问题呢,先测试一下

#21


测试是可以的,搞定啦,谢谢!

#22




问题解决,结贴吧,你的结贴已经只有 90% 了  mysql不能删除数据表

#23


这个 我也碰到了。自己测试删除也搞定了。但是根本原因还是没找到!!!!

#1




你的代码是什么?错误信息是什么,建议尽可能的提供信息,否则别人很难猜测你的问题是什么?

mysql> create temporary table t_temp(id int) engine=innodb;
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t_temp values (1);
Query OK, 1 row affected (0.05 sec)

mysql> select * from t_temp;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> drop table t_temp;
Query OK, 0 rows affected (0.05 sec)

mysql>


#2


可以删除,你的代码

#3


drop table pmc_worknolist;
错误为:
error 1051(42s02):unknow table "pmc_worknolist"

#4




你有这个表吗?!

临时表的生存期只是在session内,当你的connection断开后,这个临时表就会被MySQL自动删除。

#5


建表代码是什么?

#6


我在SQLyogEnt中能看到这个表,但是删除不掉,提示说没有这个表。
这是建表代码,放在存储过程中
DROP TABLE IF EXISTS PMC_WorkNoList;
CREATE TABLE PMC_WorkNoList(
  FInterID INT DEFAULT 1, #内码,排序用的
  FID INT NULL,
  FEntryID INT NULL,  #序列号
  FMethodID INT NULL,  #方法标号
  FWorkNo VARCHAR(45) NULL,    #工程单号
  FCustomerName VARCHAR(45) NULL,#客户
  FName VARCHAR(128)  NULL,   #物料名称
  FYSSL DECIMAL(28,10) NULL,        #订单实数
  FZDSS DECIMAL(28,10) NULL, #最低实数
  FBPSL DECIMAL(28,10) NULL, #本批数量
  FJGSL DECIMAL(28,10) NULL, #加工数量
  FDeliveryDate VARCHAR(128) NULL,    #交期
  FMadeWidth DECIMAL(28,10) NULL,  #开纸长
  FMadeLong DECIMAL(28,10) NULL,  #开纸宽
  FLevel VARCHAR(128) NULL,  #纸材
  FBang INT,  #磅数
  FSize VARCHAR(50) NULL,  #纸度
  FNote VARCHAR(256) NULL,
  FPlanHour DECIMAL(10,2),
  FColor VARCHAR(128) NULL
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
这个存储过程是有人在用的,是不是我上午我修改存储过程时候有人用了这个,然后出现错误了

#7




mysql不能删除数据表
楼主啊,你这可不叫"临时表"啊。 这不过是个普通表。

show tables 看一下有没有这个表 PMC_WorkNoList;?
然后检查一下数据库文件夹中有没有这个 PMC_WorkNoList.FRM

建议贴一下你的储存过程的代码。 仅从这个create table语句看不出什么。

#8


是一般的表嘛,直接DROP TABLE就可以了,估计这个表是被破坏了,你在目录中查找PMC_WorkNoList*。*

#9


show tables 有这个表
数据库文件夹下也有PMC_WorkNoList.FRM
代码如下:
DELIMITER $$

DROP PROCEDURE IF EXISTS `wincodb`.`P_GetBosCombinedBZ`$$

CREATE DEFINER=`root`@`%` PROCEDURE `P_GetBosCombinedBZ`($M_FOrder INT,$M_FDate VARCHAR(45),$M_FClassID INT)
BEGIN
DECLARE $T_FWorkNo VARCHAR(50) CHARACTER SET utf8;
DECLARE $T_FInterID,$maxCount,$j,$T_FMethodID,$T_FID INT;
#创建光标
DECLARE $done INT DEFAULT 0;
DECLARE PMC_CH CURSOR FOR
SELECT FWorkNo,FMethodID,FID
FROM PMC_WorkNoList
ORDER BY FEntryID;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET $done=1;
DROP TABLE IF EXISTS PMC_WorkNoList;
CREATE TABLE PMC_WorkNoList(
  FInterID INT DEFAULT 1, #内码,排序用的
  FID INT NULL,
  FEntryID INT NULL,  #序列号
  FMethodID INT NULL,  #方法标号
  FWorkNo VARCHAR(45) NULL,    #工程单号
  FCustomerName VARCHAR(45) NULL,#客户
  FName VARCHAR(128)  NULL,   #物料名称
  FYSSL DECIMAL(28,10) NULL,        #订单实数
  FZDSS DECIMAL(28,10) NULL, #最低实数
  FBPSL DECIMAL(28,10) NULL, #本批数量
  FJGSL DECIMAL(28,10) NULL, #加工数量
  FDeliveryDate VARCHAR(128) NULL,    #交期
  FMadeWidth DECIMAL(28,10) NULL,  #开纸长
  FMadeLong DECIMAL(28,10) NULL,  #开纸宽
  FClassName VARCHAR(128) NULL,  #纸料
  FPlanHour DECIMAL(10,2),
  FNote VARCHAR(256) NULL
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
IF($M_FDate='')THEN
  INSERT INTO PMC_WorkNoList(FWorkNo,FCustomerName,FName,FYSSL,FZDSS,FBPSL,FJGSL,FDeliveryDate,FMadeWidth,
  FMadeLong,FID,FEntryID,FMethodID,FNote,FClassName,FPlanHour)
  SELECT A.FBillNO,A.FCustomerName,A.FName,A.FYSSL,A.FZDSS,B.FBPSL,B.FJGSL,B.FDeliveryDate,A.FMadeWidth0,A.FMadeLong0
        ,B.FID,B.FEntryID,B.FMethodID,B.FNote,A.FlevelName,B.FPlanHour
  FROM WincoBosCombinedPmc A,WincoBosCombinedPmcEntry B
  WHERE(A.FBillNo=B.FWorkNo)AND(B.FOrder=$M_FOrder)AND(B.FMethodID!=2)
  ORDER BY B.FMethodID,B.FEntryID;
ELSE
  INSERT INTO PMC_WorkNoList(FWorkNo,FCustomerName,FName,FYSSL,FZDSS,FBPSL,FJGSL,FDeliveryDate,FMadeWidth,
  FMadeLong,FID,FEntryID,FMethodID,FNote,FClassName,FPlanHour)
  SELECT A.FBillNO,A.FCustomerName,A.FName,A.FYSSL,A.FZDSS,B.FBPSL,B.FJGSL,B.FDeliveryDate,A.FMadeWidth0,A.FMadeLong0
        ,B.FID,B.FEntryID,B.FMethodID,B.FNote,A.FlevelName,B.FPlanHour
  FROM WincoBosCombinedPmc A,WincoBosCombinedPmcEntry B
  WHERE(A.FBillNo=B.FWorkNo)AND(B.FOrder=$M_FOrder)AND(B.FDate=$M_FDate)AND(B.FMethodID!=2)
  ORDER BY B.FMethodID,B.FEntryID;
END IF;
SET $maxCount=0;
SET $j=0;
SELECT SUM(FInterID) INTO $maxCount FROM PMC_WorkNoList
WHERE(FMethodID!=2)
GROUP BY FInterID;
OPEN PMC_CH;
REPEAT
  FETCH PMC_CH INTO $T_FWorkNo,$T_FMethodID,$T_FID;
  IF NOT $done THEN
  IF($T_FMethodID=3)OR($T_FMethodID=4)THEN
    UPDATE PMC_WorkNoList
    SET FEntryID=$maxCount+1
    WHERE(FWorkNo=$T_FWorkNo)AND(FID=$T_FID);
    UPDATE WincoBosCombinedPmcEntry
    SET FEntryID=$maxCount+1
    WHERE(FWorkNo=$T_FWorkNo)AND(FID=$T_FID);
    SET $maxCount=$maxCount+1;
  ELSE
    UPDATE PMC_WorkNoList
    SET FEntryID=$j+1
    WHERE(FWorkNo=$T_FWorkNo)AND(FID=$T_FID);
    UPDATE WincoBosCombinedPmcEntry
    SET FEntryID=$j+1
    WHERE(FWorkNo=$T_FWorkNo)AND(FID=$T_FID);
    SET $j=$j+1;
  END IF;
  END IF;
UNTIL $done END REPEAT;
CLOSE PMC_CH;
IF( $M_FDate='')THEN
  SELECT A.FID,A.FEntryID,A.FMethodID,A.FWorkNo,A.FCustomerName,A.FName,A.FYSSL,A.FZDSS,
  A.FDeliveryDate,A.FMadeWidth,A.FMadeLong,A.FBPSL,A.FJGSL,A.FNote,A.FClassName,A.FPlanHour
  FROM  PMC_WorkNoList A,WincoBosCombinedPmcEntry B
  WHERE(A.FID=B.FID)AND(B.FClassID=$M_FClassID)  
  ORDER BY A.FEntryID,A.FDeliveryDate;
ELSE
  SELECT *  FROM  PMC_WorkNoList ORDER BY FEntryID,FDeliveryDate;
END IF;
DROP TABLE PMC_WorkNoList;
END$$

DELIMITER ;
执行的时候错误:Unknown table 'pmc_worknolist' 
将'pmc_worknolist'换成'pmc_worknolist1'后就无问题。
在过程中已经删除掉该表了,为什么在库中还有该表呢?弄不明白

#10




估计你的存储过程执行中异常中断了,没有执行drop table,

show table 有,.FRM文件也在,那试一下check table PMC_WorkNoList;;然后看一下系统的信息是什么?
如果可以就用repair tabel PMC_WorkNoList; 修复一下。然后再drop

#11


Table                 Op Msg_type    Msg_text
wincodb.pmc_worknolist check error     Table 'wincodb.pmc_worknolist' doesn't exist

#12


但执行repair tabel PMC_WorkNoList; 报错
错误码: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tabel PMC_WorkNoList' at line 1

#13


不好意思,table 字符输错了。
repair table PMC_WorkNoList;
drop table PMC_WorkNoList;
结果:
(1 row(s) returned)
Execution Time : 00:00:00:016
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:016

错误码: 1051
Unknown table 'pmc_worknolist'

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

#14




table
不好意思,拼写错了。
repair table xxx

#15




知道你的问题所在了,你的表是innodb存储引擎的,估计是你执行过程中出了什么异常。导致虽然在数据文件中的数据删除后,表的结构文件没有来得及或其它原因未能同时从操作系统中删除。

解决方法也很简单。直接到文件夹中把这个  PMC_WorkNoList.frm 删除即可。

#16


把my.ini中的
Inndb_force_recovery=1
强制不进行检查,但仍旧不行,真不知道该怎么做了?

#17


没人知道吗?

#18


搜索PMC_WorkNoList*.*
删除试试

#19




 15 ACMAIN_CHM :
知道你的问题所在了,你的表是innodb存储引擎的,估计是你执行过程中出了什么异常。导致虽然在数据文件中的数据删除后,表的结构文件没有来得及或其它原因未能同时从操作系统中删除。

解决方法也很简单。直接到文件夹中把这个  PMC_WorkNoList.frm 删除即可。


试一下看看结果。

#20


删除那个文件mysql会不会出问题呢,先测试一下

#21


测试是可以的,搞定啦,谢谢!

#22




问题解决,结贴吧,你的结贴已经只有 90% 了  mysql不能删除数据表

#23


这个 我也碰到了。自己测试删除也搞定了。但是根本原因还是没找到!!!!