我创建了两个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 ;
有人可以向我解释如何执行此操作或指向我有关此主题的资源吗?
答案 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中详细介绍了一些内容。