如何使用存储过程和事务将与其他表相关的数据插入到表中?

问题描述

我有一个已导入数据库的表。该表具有一系列用户友好的数据,这些数据来自Excel模板,该模板先导出为CSV,然后导入到表中。 在一个过于简化的示例中,我得到了以下内容:

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 ;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...