使用命令:
CREATE TABLE IF NOT EXISTS `test`.`t1` (
`col` VARCHAR(16) NOT NULL
) ENGINE=MEMORY;
在MySQL查询浏览器中运行两次会导致:
表't1'已经存在错误1050
我本以为创建表“ IF NOT EXISTS”不会引发错误。我是否缺少某些东西或这是一个错误?我正在运行5.1版。谢谢。
Answers:
如前所述,这是一个警告而不是一个错误,但是(如果像我一样)您希望事情在没有警告的情况下运行,则可以禁用该警告,然后在完成后再次启用它。
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
您可以使用以下查询在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`)
);
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`)
);***
我有一个解决方案,可能也适用于您。我的数据库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上运行)
使用以下参数创建mysql连接。“'raise_on_warnings':错误”。它将忽略警告。例如
config = {'user': 'user','password': 'passwd','host': 'localhost','database': 'db', 'raise_on_warnings': False,}
cnx = mysql.connector.connect(**config)
IF NOT EXISTS
。
我在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
好了,已经提供了很多答案,很多答案也很有意义。
一些人提到这只是警告,而另一些人则给出了禁用警告的临时方法。所有这些都会起作用,但是当数据库中的事务数量很高时,这会增加风险。
我今天遇到了类似的情况,这是我想出的查询...
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;
/
这很简单,如果在运行查询时出现异常,它将被抑制。您可以将用作SQL
或Oracle
。