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

MySQL从一个表中选择,插入到另一个表中,mysql,sql,Mysql,Sql,我创建了两个MySQL表。一个是导入CSV,称为staging\u part\u type,另一个是实际的part\u type记录最终被称为part\u type,减去已经存在产品代码的任何记录。两个表完全相同,由id、in\u use、default\u name、product\u code列组成 做这样的事有什么特别的名字吗?我还没有找到任何关于这方面的完整教程,只有一堆单独的教程,我没能把它们放在一个有效的查询中,因为我在这方面缺乏经验,经过一周的阅读,我仍然几乎不明白我在做什么 像这

我创建了两个MySQL表。一个是导入CSV,称为
staging\u part\u type
,另一个是实际的
part\u type
记录最终被称为
part\u type
,减去已经存在
产品代码的任何记录。两个表完全相同,由
id、in\u use、default\u name、product\u 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 ;

有人能给我解释一下怎么做或者给我指一个关于这个主题的资源吗?

一个典型的方法是从
零件类型上的唯一索引/约束开始,然后在重复密钥更新上使用

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);
这种方法的优点。首先,它可以工作,使用唯一索引查找产品代码。不需要进行额外的查找(但您可以这样做)

其次,
集合
是非操作,因此它不会导致被修改记录的数量增加

第三,这只会忽略由密钥重复引起的错误(可能仅限于
product\u code
)。其他错误不会被忽略

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


第五,这没有种族条件。数据库确保
产品\u代码的唯一性

典型的方法是从
零件类型
的唯一索引/约束开始,然后在重复密钥更新时使用

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);
这种方法的优点。首先,它可以工作,使用唯一索引查找产品代码。不需要进行额外的查找(但您可以这样做)

其次,
集合
是非操作,因此它不会导致被修改记录的数量增加

第三,这只会忽略由密钥重复引起的错误(可能仅限于
product\u code
)。其他错误不会被忽略

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


第五,这没有种族条件。数据库确保您要查找的
产品\u代码的唯一性

插入SELECT
。文档中有详细说明。

您正在查找的
插入到SELECT中。文档中有详细说明。

与SQL中的常见情况一样,有两种方法可以实现这一点,一种是子查询,另一种是联接

子查询方法更容易理解和编写,但是连接方法更有效,如果这是一个任务关键型查询,您会怎么做

由于您只是导入一个简单的CSV,我们将使用带有“exists”的“关联子查询”,其工作原理如下:

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)

您的思路是正确的,但需要设置两个查询并将它们链接在一起。括号中的查询将运行,返回的结果只有行中不存在的结果。首先尝试运行第二行,看看会返回什么,然后添加第一行以进行插入。

与SQL中的常见情况一样,有两种方法可以完成此操作,一种是子查询,另一种是联接

子查询方法更容易理解和编写,但是连接方法更有效,如果这是一个任务关键型查询,您会怎么做

由于您只是导入一个简单的CSV,我们将使用带有“exists”的“关联子查询”,其工作原理如下:

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)

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

非常优雅,这正是我在这种情况下所需要的,因为文件确实非常小。我目前正在努力学习吉伦森的数据库管理系统基础知识。这是一个很大的问题,但我肯定会研究连接与子查询的区别。非常优雅,这正是我在这种情况下所需要的,因为文件确实非常小。我目前正在努力学习吉伦森的数据库管理系统基础知识。这是一个很难理解的概念,但我肯定会研究连接与子查询的区别。我喜欢这个概念,并且我已经使
product\u code
独一无二。但是,我在语句的SET部分遇到语法错误。在上,似乎有一个稍微不同的顺序,虽然它似乎也取代了原来的。@G\U V。这是因为
SET
不是语法的一部分。在
更新
后,我觉得它很合适,所以我有时会添加它。我喜欢这一概念,并且我使
产品_code
独一无二。但是,我在语句的SET部分遇到语法错误。在上,似乎有一个稍微不同的顺序,虽然它似乎也取代了原来的。@G\U V。这是因为
SET
不是语法的一部分。在
更新之后,我觉得它看起来不错,所以我有时会把它添加进去。