在MySql中,我们可以选择INSERT IGNORE(do not update existing)
来生成包含查询CREATE TABLE IF NOT EXISTS
和INSERT IGNORE INTO
的sql文件。
但在这种情况下,如果表存在,“INSERT IGNORE INTO”将再次插入数据。 我想问一下,有没有一种方法来实现这个功能:如果表不存在,它将创建表并插入数据。
如果表存在,则不会插入数据。
实际上我已经尝试过如何实现,我知道用存储过程是可能的,但是用一个sql文件将由批处理文件执行,如何实现这个功能?
我的代码是这样的
CREATE DATABASE IF NOT EXISTS martintest;
USE martintest;
CREATE TABLE IF NOT EXISTS `martin1` (
`col1` int(11) default NULL,
`col2` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT IGNORE INTO `martin1` (`col1`, `col2`) VALUES (2, 'bbb'), (1, 'aaa');
答案 0 :(得分:1)
一个选项,也许不推荐(在这种情况下,必须小心使用会话变量:@`table_exists?`
),但最后的选项是:
/* CODE FOR DEMONSTRATION PURPOSES */
USE `martintest`;
SET @`table_schema` := 'martintest', @`table_name` := 'martin1';
SELECT EXISTS
(
SELECT NULL
FROM `information_schema`.`TABLES` `ist`
WHERE `ist`.`TABLE_SCHEMA` = @`table_schema` AND `ist`.`TABLE_NAME` = @`table_name`
)
INTO @`table_exists?`;
CREATE TABLE IF NOT EXISTS `martin1` (
`col1` int(11) DEFAULT NULL,
`col2` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `martin1` SELECT 2, 'bbb' FROM DUAL WHERE 0 = @`table_exists?`;
INSERT INTO `martin1` SELECT 1, 'aaa' FROM DUAL WHERE 0 = @`table_exists?`;
/* CODE FOR DEMONSTRATION PURPOSES */
答案 1 :(得分:0)
使用CREATE TABLE而不是IF NOT EXISTS 如果表存在,它将失败,并且不会导入文件的其余部分。
请勿使用--force参数,。
答案 2 :(得分:0)
检查表格是否存在:
USE martintest;
SET @tablecount := 0
SELECT @tablecount := count(*)
INTO @tablecount
FROM information_schema.tables
WHERE table_schema = 'martintest'
AND table_name = 'martin1'
--check if table count = 0
IF @tablecount = 0
(
CREATE TABLE `martin1` (
`col1` int(11) default NULL,
`col2` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `martin1` (`col1`, `col2`) VALUES (2, 'bbb'), (1, 'aaa');
)