【问题标题】:How can I insert into a table related data in other tables using stored procedure and transaction?如何使用存储过程和事务将其他表中的表相关数据插入到表中?
【发布时间】:2020-10-08 23:48:19
【问题描述】:

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

【问题讨论】:

  • "获取相关数据到 mydb.csv 列,以便能够使用存储过程将其插入另一个表" 虽然我们可以弄清楚您可能的意思,但这并不清楚。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。 minimal reproducible example
  • @philipxy 我明白,但是我很难正确地表达自己,所以我明白我没有选择最好的词。你能建议编辑吗?关于这个例子,我以最简单的形式给出了一个例子:我不需要用不必要的代码来大惊小怪。
  • 我再次建议您尝试做我在第 1 条评论中建议的事情。你真的似乎没有真正试图澄清。现在我要留下我一直留下的另一条评论。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。

标签: mysql stored-procedures database-normalization database-cursor


【解决方案1】:

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 ;

【讨论】:

  • 我以前用过子查询,但我没有这样用过。特别是 csv 表在括号之间的语句中不存在的部分(如果它是单独的,我会认为它是“不完整的”)感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多