MySQL“CREATE TABLE IF NOT EXISTS”->错误1050

111

使用以下命令:

CREATE TABLE IF NOT EXISTS `test`.`t1` (
    `col` VARCHAR(16) NOT NULL
) ENGINE=MEMORY;

在MySQL Query Browser中运行此命令两次会导致:

表 't1' 已经存在 错误代码1050

我本以为使用"IF NOT EXISTS"语句创建表时不会出现错误。我是否遗漏了某些内容或这是一个bug?我正在运行版本5.1。谢谢。

9个回答

81

在我的5.0.27版本中完全正常

我只是收到一个警告,而不是错误提示,表已经存在;


9
谢谢Eli,你说得对。让我困扰的是我的第三方客户端软件为我引发了这个警告异常。 - user199559

40

如前所述,这只是一个警告而不是错误,但(如果像我一样)您希望事情无警告运行,可以禁用该警告,然后在完成后重新启用它。

SET sql_notes = 0;      -- Temporarily disable the "Table already exists" warning
CREATE TABLE IF NOT EXISTS ...
SET sql_notes = 1;      -- And then re-enable the warning again

有趣的想法,但可能有些晦涩难懂。在某些语言中,例如CSS,警告几乎没有用处,而在其他语言中,例如PHP,警告非常重要需要注意。虽然我不是SQL的专家,但我很好奇还有哪些警告可能会发生,忽略它们是否会导致潜在的攻击向量? - John

16
您可以使用以下查询来在MySql中的特定数据库创建表格。
create database if not exists `test`;

USE `test`;

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

/*Table structure for table `test` */

CREATE TABLE IF NOT EXISTS `tblsample` (

  `id` int(11) NOT NULL auto_increment,   
  `recid` int(11) NOT NULL default '0',       
  `cvfilename` varchar(250)  NOT NULL default '',     
  `cvpagenumber`  int(11) NULL,     
  `cilineno` int(11)  NULL,    
  `batchname`  varchar(100) NOT NULL default '',
  `type` varchar(20) NOT NULL default '',    
  `data` varchar(100) NOT NULL default '',
   PRIMARY KEY  (`id`)

);

11
create database if not exists `test`;

USE `test`;

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

/*Table structure for table `test` */

***CREATE TABLE IF NOT EXISTS `tblsample` (
  `id` int(11) NOT NULL auto_increment,   
  `recid` int(11) NOT NULL default '0',       
  `cvfilename` varchar(250)  NOT NULL default '',     
  `cvpagenumber`  int(11) NULL,     
  `cilineno` int(11)  NULL,    
  `batchname`  varchar(100) NOT NULL default '',
  `type` varchar(20) NOT NULL default '',    
  `data` varchar(100) NOT NULL default '',
   PRIMARY KEY  (`id`)
);***

4
我有一个解决问题的方案,可能也适用于您。我的数据库处于无法找到表的状态下,DROP TABLE操作失败,但是CREATE TABLE同样失败,因为MySQL认为该表已经存在。(这种状态可能会干扰您的IF NOT EXISTS子句)。
最终我找到了这个解决方案
sudo mysqladmin flush-tables

对于我来说,在没有sudo的情况下,我会遇到以下错误:

mysqladmin: refresh failed; error: 'Access denied; you need the RELOAD privilege for this operation'

(运行于 OS X 10.6)

0
使用以下参数创建mysql连接。"'raise_on_warnings': False"。它将忽略警告。例如:
config = {'user': 'user','password': 'passwd','host': 'localhost','database': 'db',   'raise_on_warnings': False,}
cnx = mysql.connector.connect(**config)

我在Python中遇到了同样的问题。我将raise_on_warnings设置为"true",所以即使我使用了IF NOT EXISTS,也会引发异常。 - Pikamander2

0
如果在使用Phpmyadmin导出时遇到这个错误,可以使用自定义选项并添加“drop tables”语句来清除这个错误。

0

我在Debian上遇到了与@CraigWalker类似的问题:我的数据库处于这样的状态,即DROP TABLE失败,因为找不到表,但CREATE TABLE也失败,因为MySQL认为该表仍然存在。因此,尽管我在phpmyadmin中查看时它并不存在,但这个损坏的表仍然存在于某个地方。

我通过复制包含一些MyISAM和一些InnoDB表的数据库的整个文件夹来创造了这种状态。

cp -a /var/lib/mysql/sometable /var/lib/mysql/test

(这不是推荐的做法!)

在 phpmyadmin 中,所有 InnoDB 表格都无法在新建立的数据库 test 中看到。

sudo mysqladmin flush-tables 也没有帮助。

我的解决方案:我必须使用 mysqldump 删除新的 test 数据库并将其复制。

mysqldump somedatabase -u username -p -r export.sql
mysql test -u username -p < export.sql

0

已经提供了很多答案,而且很多都是有道理的。

有些人提到这只是警告,有些人提供了一种暂时禁用警告的方法。所有这些方法都可以解决问题,但是当您的数据库中的交易数量很高时,会增加风险。

我今天遇到了类似的情况,这里是我想出的查询语句...

declare
begin
  execute immediate '
    create table "TBL" ("ID" number not null)';
  exception when others then
    if SQLCODE = -955 then null; else raise; end if;
end;
/

这很简单,如果在运行查询时出现异常,它将被抑制。您可以将其用于 SQLOracle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接