首页 > 解决方案 > 如何使用存储过程和事务将其他表中的表相关数据插入到表中?

问题描述

我有一个已导入数据库的表。该表具有一系列用户友好的数据,因为它来自导出为 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)?

标签: mysqlstored-proceduresdatabase-normalizationdatabase-cursor

解决方案


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 ;

推荐阅读