MySQL从一个表中选择,插入到另一个表中

时间:2016-09-06 20:06:52

标签: mysql sql

我创建了两个MySQL表。一个用于导入CSV,名为staging_part_type,另一个用于实际part_type记录最终称为part_type,减去任何已存在product_code的记录。两个表都相同,由列id, in_use, default_name, product_code组成。

是否有特定的名称来做这样的事情?我没有找到任何完整的教程,只有一堆独立的教程,我没有把它们放在一个有效的查询中,因为我缺乏这方面的经验,经过一周的阅读,我仍然几乎不明白我的意思正在做。

这样的东西?

INSERT IGNORE INTO part_type (in_use, default_name, product_code)
        SELECT (in_use, default_name, product_code)
            FROM staging_part_type      
            WHERE part_type.product_code IS NOT staging_part_type.product_code;

创建表的代码,除了名称之外,两个表都是相同的。

CREATE TABLE IF NOT EXISTS `part_type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `in_use` tinyint(1) NOT NULL,
  `default_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `product_code` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=580 ;

有人可以向我解释如何执行此操作或指向我有关此主题的资源吗?

3 个答案:

答案 0 :(得分:3)

与SQL中的情况一样,有两种方法可以做到这一点,使用子查询和连接。

子查询方法更容易理解和编写,但是如果这是一个关键任务查询,则连接方法更有效,并且您可以做什么。

由于您只是导入一个简单的CSV,我们将使用"相关子查询"使用"存在",其工作方式如下:

INSERT INTO part_type (in_use, default_name, product_code)
    SELECT in_use, default_name, product_code
        FROM staging_part_type      
        WHERE NOT EXISTS 
          (SELECT product_code FROM part_type WHERE product_code = staging_part_type.product_code)

您正在思考正确的方向,但您需要设置两个查询并将它们链接在一起。括号中的查询运行,返回的唯一结果是行中不存在的结果。首先尝试自己运行第二行,看看你会得到什么,然后在第一行添加以使插入发生。

答案 1 :(得分:1)

一种典型的方法是从part_type上的唯一索引/约束开始,然后使用on duplicate key update

CREATE UNIQUE INDEX unq_part_type_product_code ON part_type(product_code);

INSERT INTO part_type (in_use, default_name, product_code)
     SELECT in_use, default_name, product_code
     FROM staging_part_type  
     ON DUPLICATE KEY UPDATE product_code = VALUES(product_code);

这种方法的优点。首先,它可以工作,使用唯一索引查找产品代码。不需要进行额外的查找(但你可以这样做)。

其次,SET是非操作,因此不会导致修改记录数量的任何增加。

第三,这只会忽略由重复键(可能只有product_code)引起的错误。其他错误不会被忽略。

第四,如果您愿意,这允许您从登台表传入其他值。

第五,这没有竞争条件。数据库确保product_code的唯一性。

答案 2 :(得分:1)

您正在寻找INSERT INTO SELECT。它在this question和文档here中详细介绍了一些内容。