MySQL“如果不存在则创建表”->错误1050


74

使用命令:

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

在MySQL查询浏览器中运行两次会导致:

表't1'已经存在错误1050

我本以为创建表“ IF NOT EXISTS”不会引发错误。我是否缺少某些东西或这是一个错误?我正在运行5.1版。谢谢。

Answers:


55

在5.0.27中对我有效

我只是得到该表存在的警告(不是错误)。


5
谢谢Eli,您说得对。是我的第三方客户端软件向我发出此警告作为例外,这是我的问题。
1995

30

如前所述,这是一个警告而不是一个错误,但是(如果像我一样)您希望事情在没有警告的情况下运行,则可以禁用该警告,然后在完成后再次启用它。

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的高手,但我很好奇,还会发生其他警告,是否忽略这些警告会导致潜在的攻击媒介?
约翰·

9

您可以使用以下查询在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`)

);

7
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`)
);***

3

我有一个解决方案,可能也适用于您。我的数据库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':错误”。它将忽略警告。例如

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 '02

0

我在debian上遇到了与@CraigWalker类似的问题:我的数据库DROP TABLE由于无法找到表而处于CREATE TABLE失败状态,但是由于MySQL认为该表仍然存在而失败。因此,当我查看phpmyadmin时,损坏的表仍然存在,尽管它并不存在。

我通过复制整个文件夹来创建这种状态,该文件夹包含一个带有MyISAM一些InnoDB表的数据库

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

(不建议这样做!)

test在phpmyadmin的新数据库中不可见的所有InnoDB表。

sudo mysqladmin flush-tables 也没有帮助。

我的解决方案:我必须使用删除新的测试数据库,drop database test并使用复制它mysqldump

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


0

如果在Phpmyadmin导出后有人遇到此错误,则使用自定义选项并添加“删除表”语句可以清除此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.