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

Posted

技术标签:

【中文标题】MySQL“如果不存在则创建表”-> 错误 1050【英文标题】:MySQL "CREATE TABLE IF NOT EXISTS" -> Error 1050 【发布时间】:2010-12-11 16:17:12 【问题描述】:

使用命令:

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

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

表 't1' 已存在 错误 1050

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

【问题讨论】:

【参考方案1】:

在 5.0.27 中对我来说很好

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

【讨论】:

谢谢伊莱,你是对的。这是我的第 3 方客户端软件将这个警告作为一个例外对我来说是我的问题。【参考方案2】:

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

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 的高手,但我很好奇还会出现哪些其他警告以及忽略它们是否会导致潜在的攻击媒介?【参考方案3】:

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

);

【讨论】:

【参考方案4】:
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】:

我有一个可能也适用于您的问题的解决方案。我的数据库处于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 上运行)

【讨论】:

【参考方案6】:

使用以下参数创建 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,也会引发异常。【参考方案7】:

我在 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

【讨论】:

【参考方案8】:

嗯,已经提供了很多答案,而且很多答案也很有意义。

有些人提到这只是警告,有些人则提供了一种临时方法来禁用警告。所有这些都行得通,但是当您的数据库中的事务数量很高时会增加风险

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于MySQL“如果不存在则创建表”-> 错误 1050的主要内容,如果未能解决你的问题,请参考以下文章

访问:如果表不存在则创建表

PDO MYSQL 如果不存在则创建表并找出它是不是已创建

Bigquery:如果不存在则创建表并使用 Python 和 Apache AirFlow 加载数据

MySQL 仅在表不存在时插入数据

插入表,如果表不存在,则创建表然后插入

PostgreSQL:如果不存在则创建表 AS