MySQL从一个表中选择,插入到另一个表中
我创建了两个MySQL表。一个是导入CSV,称为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列组成 做这样的事有什么特别的名字吗?我还没有找到任何关于这方面的完整教程,只有一堆单独的教程,我没能把它们放在一个有效的查询中,因为我在这方面缺乏经验,经过一周的阅读,我仍然几乎不明白我在做什么 像这
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
不是语法的一部分。在更新之后,我觉得它看起来不错,所以我有时会把它添加进去。