【问题标题】:How do I insert data into a mysql database using a procedure?如何使用过程将数据插入 mysql 数据库?
【发布时间】:2010-01-09 14:06:13
【问题描述】:

我有一个过程,其中包含两个用于两个不同表的插入语句。我必须先将数据插入 table1,然后才能插入 table2。我正在使用 PHP 进行数据收集。我想知道的是如何将多行插入table2,它可以有很多与table1关联的行。我该怎么做?

我只想将人存储在 table1 中一次,但 table2 需要多行。如果这些插入语句在单独的过程中,我不会有问题,但我只是不知道如何在 table2 中插入多行而不拒绝第二条重复记录。

BEGIN

INSERT INTO user(name, address, city) VALUES(Name, Address, City);

INSERT INTO order(order_id, desc) VALUES(OrderNo, Description);

END

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我建议你分开做,否则你需要一个复杂的解决方案,如果发生变化,很容易出错。

    复杂的解决方案是:

    • 使用分隔符连接所有订单号和描述。 (orderno#description)
    • 使用不同的分隔符连接所有订单。 (orderno#description/orderno#description/...)
    • 将其传递给过程
    • 在过程中,按顺序分隔符分割字符串,然后循环遍历它们中的每一个
    • 对于每个订单,用第一个分隔符分割字符串,然后插入到相应的列中

    如您所见,这很糟糕。

    【讨论】:

    • 你好托尔。是的,这很糟糕。我有其他人告诉我,这非常简单,我需要对该过程发出一次调用,但我不知道这是怎么可能的。我想先验证一下。
    • 我必须同意,这不好。
    • @B52s - 如果不先将列表序列化,就无法将列表传递给过程,因此这是通过一个过程插入多行的唯一方法。
    • Tor,请看一下 Shylent 在说什么。他的建议会奏效吗?
    • 好的,谢谢 Tor。我同意,事实上。我会分开插入。
    【解决方案2】:

    很抱歉,是什么阻止您在单独的查询中将数据插入这些(看似不相关的)表中?如果你不喜欢它中途失败的想法,你可以将它包装到一个事务中。我知道,mysqlipdo 可以做到这一点。

    直接回答您的问题,insertignore 模式将插入期间的错误变为警告,因此在尝试插入重复行时会发出警告并且不会插入行,但没有错误。

    【讨论】:

    • 你好,害羞。谢谢您的帮助。 “看似无关”,但实际上是相关的。我的错,因为我应该展示,至少两者之间的共同点。我正在使用 mysqli,我当然可以使用事务。我已经尝试在 t1 中输入一条记录,在 t2 中输入 3 条记录,但 t2 只输入了一条。我相信交易回滚了。因此,如果我使用 IGNORE,那么我会将所有三行都放入 table2 中?
    • 是的,我说“貌似”,因为代码没有表明它们是相关的 :) 那么无论如何,“t2 只拿了一个”是什么意思?您在调用 commit() 之前发出了 四个 插入,它只插入了两个(一个用于 t1,一个用于 t2)?
    【解决方案3】:

    您可以在第一条语句中使用IGNORE 关键字。
    http://dev.mysql.com/doc/refman/5.1/en/insert.html

    如果使用 IGNORE 关键字,则执行 INSERT 语句时发生的错误将被视为警告。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,行仍然没有插入,但没有发出错误。
    但不知何故,这对我来说似乎相当低效,一个“从后面刺穿眼睛胸部”的解决方案。

    【讨论】:

    • 大声笑...我同意。我从来没有完全想象过它,但你是对的。 :) 那么,我应该分开插入语句吗?这是正确的做法吗?
    猜你喜欢
    • 2017-01-11
    • 2018-08-06
    • 2011-08-06
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多