mysql - 如何使用存储过程和事务将其他表中的表相关数据插入到表中?
问题描述
我有一个已导入数据库的表。该表具有一系列用户友好的数据,因为它来自导出为 CSV 然后导入到表中的 Excel 模板。在一个过于简单的例子中,我有以下内容:
MYDB.CSV
+----------+--------------------+------------------+-------------------------------------+
| language | item | title | description |
+----------+--------------------+------------------+-------------------------------------+
| Spanish | Grandioso Artículo | Gran Título | Este es un ejemplo en español. |
| English | Powerful Item | Power Title | This is an example in english. |
| French | Incroyable Article | Incroyable Titre | Ceci est un exemple en français. |
| English | Dull Item | Dull Title | This is another example in english. |
+----------+--------------------+------------------+-------------------------------------+
这些列的数据属于包含更多相关特征的不同表,例如:
MYDB.LANGUAGES
════╤════════════════════
id │ code description
────┼────────────────────
1 │ eng English
2 │ spa Spanish
3 │ fra French
════╧════════════════════
MYDB.ITEMS
════╤═══════════════════════════════
id │ code description
────┼───────────────────────────────
1 │ dull-789 Dull Item
2 │ incr-456 Incroyable Article
3 │ gran-123 Grandioso Artículo
4 │ powe-951 Powerful Item
════╧═══════════════════════════════
如何获取与mydb.csv
列相关的数据,以便能够使用存储过程将其插入到另一个表中?我试图得到这样的东西:
MYDB.NICETABLE
id │ code description title
════╪═══════════════════════════════════════
1 │ spa gran-123 Gran Título
2 │ eng powe-951 Powerful Item
3 │ fra incr-456 Incroyable Titre
4 │ eng dull-789 Dull Title
我在存储过程中尝试了以下代码。必须按原样插入的数据,就像csv.title
在这个例子中一样,我可以插入它::
DELIMITER //
DROP PROCEDURE IF EXISTS addItems //
CREATE PROCEDURE addItems ()
BEGIN
START TRANSACTION;
/* INSERT INTO the corresponding tables */
INSERT INTO mydb.nicetable (title)
SELECT `title` FROM csv;
COMMIT;
END //
DELIMITER ;
CALL addBrand();
如何逐行比较数据(即csv.language
)并获得我需要的数据(即languages.code
)并将其插入另一个表(即nicetable.code
)?
解决方案
SELECT 就像任何查询一样,遵循相同的规则。
在您的情况下,您使用语言进行子选择
如果您需要来自其他表的数据,则需要将它们连接起来。
DELIMITER //
DROP PROCEDURE IF EXISTS addItems //
CREATE PROCEDURE addItems ()
BEGIN
START TRANSACTION;
/* INSERT INTO the corresponding tables */
INSERT INTO mydb.nicetable (code ,title)
SELECT (SELECT `code` FROM LANGUAGES LS WHERE LS.description = c.language LIMIT 1), c.`title` FROM csv c;
COMMIT;
END //
DELIMITER ;
推荐阅读
- c - FreeRTOS 饥饿和时间切片
- payment-gateway - 如何在 PesaPal 演示系统中获得超出待处理的付款
- jquery - 如果方法不是,则卸载一些代码
- c# - 使用子目录通配符 (glob) 搜索文件
- laravel - laravel 如果在控制器中使用验证导致白色空白屏幕
- php - hasFile 函数在 Laravel5.8 中不起作用
- amazon-web-services - 如何使 S3 上生成的下载链接失效
- mongodb - 语法错误:缺少:属性 id 之后 - MongoDB
- c# - 在 Unity 中重新设置大型对象的父级最多需要 8 秒
- java - 如何在 sharedperfernce 中保存自定义数组列表