【问题标题】:How might I insert an array of data into a database table?如何将数据数组插入数据库表?
【发布时间】:2009-04-09 05:31:37
【问题描述】:

我正在开发一个考勤管理程序,用于维护学生的缺勤记录。该软件的用户需要输入不同的日期,每月更新一次:例如,将输入学生在该特定月份缺勤的日期列表,然后我的程序必须将它们存储到数据库中,每个在相应表中作为新行添加的日期。

我在内部使用数组存储了日期,我如何将它们传输到数据库中?我应该如何进行?

【问题讨论】:

    标签: sql database database-design


    【解决方案1】:

    你没有提到使用的数据库系统,所以我的回复是笼统的。执行此操作的通常方法是一个接一个地运行多个插入语句:

    INSERT INTO Table1 (FirstColumn, SecondColumn)
    VALUES ('a', 'b');
    INSERT INTO Table1 (FirstColumn, SecondColumn)
    VALUES ('c', 'd');
    INSERT INTO Table1 (FirstColumn, SecondColumn)
    VALUES ('e', 'f');
    GO
    

    做到这一点的诀窍是使用 UNION ALL 语句:

    INSERT INTO Table1 (FirstColumn, SecondColumn)
    SELECT 'a', 'b'
    UNION ALL
    SELECT 'c', 'd'
    UNION ALL
    SELECT 'e', 'f'
    GO
    

    2008 之前的 SQL Server 版本仅支持这些方法。但 SQL 2008 和 MySQL 3.22 及以上版本也支持 Row 构造方法:

    INSERT INTO Table1 (FirstColumn, SecondColumn)
    VALUES ('a', 'b'),
    VALUES ('c', 'd'),
    VALUES ('e', 'f')
    GO
    

    现在您可以使用上述任何一种方法来遍历您的数组并将各个考勤行添加到数据库中。

    【讨论】:

      【解决方案2】:
      foreach($arrayName 作为 $arrayValue) { // 在这里运行你的查询! }

      例如:

      $myArray = array('苹果','橙子','葡萄'); foreach($myArray as $arrayFruit) { $query = "INSERT INTO `Fruits` (`FruitName`) VALUES ('" . $arrayFruit . "')"; mysql_query($query, $connection); }

      这有意义/符合您的想法吗?

      【讨论】:

      • 非常正确...我第二次...只是举一个简单的例子。如果变量是用户提供的,或者数组中有大量变量,则 def 使用绑定变量
      • 好吧,够公平的......但我想了解如何做到这一点?我是认真的...如果您有资源,那就太好了。
      • 将代码放入普通控制结构有什么问题?如果将数据库查询放在递归函数中会更好吗?或者放入一个从循环中调用的自定义函数?
      • 好的,让我解释一下。我早上的扳机指可能有点快。我取消了投票。但仍然:只要您可以避免将查询放入任何类型的循环中,就这样做! Cerberus 的解决方案很好!对于阅读查询,这一点更为重要!!!
      • 如果整体规模扩大并且您正在添加或阅读越来越多的条目,将会对性能产生巨大影响!我犯了一次错误,我已经重写了那个应用程序。
      【解决方案3】:

      您想单独存储日期,以便您可以处理它们、查询它们等吗? 还是您只想按原样存储数组?

      如果您想单独存储日期,您可能需要创建一个表,其中包含学生的 FK、日期列和日期性质列,例如缺勤、迟到、...

      那么您确实会将单个日期存储到该表中。如果你必须,通过迭代,但如果你可以使用 Cerbrus 的解决方案之一!不建议在循环中使用 db-queries。

      如果您只需要将该数组存储在某处,则可以对其进行序列化并将序列化后的字符串存储在 text 或 varchar 列中。

      【讨论】:

      • 那么,您是否建议使用循环动态构建 UNION 语句 - 如果数组本质上是动态的? ...然后不是迭代多个查询,而是只使用一次 UNION?
      • 是的!也许对于我知道永远不会扩展的小型应用程序而言。或者一个小任务,我知道由于它的性质,它永远不会超过几次迭代。
      • 对...肯定是好的技术。这对我来说很有价值,因为通常我必须为我所做的事情运行相当大的动态循环......这就是我想知道的原因
      • 这也是我所做的......而且我有一个案例,我设法将专用服务器推送到并超过限制,只是因为“少数”递归读取查询。之后我开始学习 SQL。
      【解决方案4】:

      您使用什么语言和什么类型的数据库?这是一个网络应用程序吗?桌面应用程序?如果没有更多信息,我们无法为您提供帮助。

      根据您的情况,上述任何解决方案都可以工作。或者,您甚至可以一次将所有考勤记录加载为 CSV 或 XML 文档。也许对您进行更多研究会帮助您提出更有用的问题?

      【讨论】:

        【解决方案5】:

        遍历数组并为每个日期执行插入 SQL。

        【讨论】:

        • 为什么为什么为什么?因为我不认为在没有反射和考虑更好的选项的情况下迭代查询是非常好的。但正如我对 johnnietheblack 所说,我的扳机手指太快了,我取消了我的反对票。
        猜你喜欢
        • 2017-07-10
        • 2011-04-13
        • 1970-01-01
        • 2016-11-29
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多