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

时间:2009-10-30 16:39:20

标签: sql mysql mysql-error-1050

使用命令:

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

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

  

表't1'已存在错误1050

我原本以为创建表“IF NOT EXISTS”不会抛出错误。我错过了什么或这是一个错误吗?我正在运行 5.1 版本。感谢。

9 个答案:

答案 0 :(得分:42)

在5.0.27

中适合我

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

答案 1 :(得分:23)

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

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

答案 2 :(得分:5)

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

);

答案 3 :(得分:2)

我有一个可能适用于您的问题的解决方案。我的数据库处于DROP TABLE失败的状态,因为它无法找到表...但是CREATE TABLE也失败了,因为MySQL认为该表存在。 (这种状态很容易搞乱你的IF NOT EXISTS条款)。

我最终找到this solution

sudo mysqladmin flush-tables

对我来说,如果没有sudo,我收到以下错误:

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

(在OS X 10.6上运行)

答案 4 :(得分:1)

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

答案 5 :(得分:0)

我和debian上的@CraigWalker有类似的问题:我的数据库处于DROP TABLE失败的状态,因为它无法找到该表,但是CREATE TABLE也失败了,因为MySQL以为桌子还存在。所以破碎的桌子仍然存在于某个地方,虽然当我查看phpmyadmin时它不存在。

我创建此状态只是复制包含数据库的整个文件夹,其中包含一些MyISAM和一些InnoDB

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

(不建议这样做!)

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

sudo mysqladmin flush-tables也没有帮助。

我的解决方案:我必须使用drop database test删除新的测试数据库,然后将其复制为mysqldump

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

答案 6 :(得分:0)

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

答案 7 :(得分: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

答案 8 :(得分:-1)

使用以下参数创建mysql连接。 “'raise_on_warnings':假”。它会忽略警告。 e.g。

config = {'user': 'user','password': 'passwd','host': 'localhost','database': 'db',   'raise_on_warnings': False,}
cnx = mysql.connector.connect(**config)