【问题标题】:mysql prepared statement set default value for insertmysql准备好的语句设置插入的默认值
【发布时间】:2014-09-25 01:45:08
【问题描述】:

我有一个包含两列的表,将一个表的行 ID 链接到另一个表的行 ID,基本上我需要能够在该表上插入多行,其中一列是插入的固定值和其他变化。插入是使用准备好的语句在 php 中完成的,并且要插入的行数未知(我已经使用 call_user_func_array 解决了这部分)。

这是我需要做的一个例子:

example_table(column_A,column_B)

插入:

INSERT INTO example_table (column_A, column_B) VALUES(a, b), VALUES(a, c), VALUES(a, d);

翻译成准备好的语句:

INSERT INTO example_table (column_A, column_B) VALUES(?, ?), VALUES(?, ?), VALUES(?, ?);

bind_param 上的值:

('ssssss', 'a', 'b', 'a', 'c', 'a', 'd')

正如你所看到的'a'的重复。有没有办法存储'a'并将其默认为仅用于当前插入的column_A?

我想在 bind_param 上做的例子:

('ssss', 'a', 'b', 'c', 'd')

上面的“a”用于插入的所有行的 column_A(示例中为 3 行)。任何帮助将不胜感激

【问题讨论】:

    标签: mysql


    【解决方案1】:

    否,不可能多次“别名”一个值。每个占位符都是唯一的,并且必须绑定到一个值。 (使用 PDO 中的命名参数甚至不可能可靠地做到这一点。)

    如果自动动态构建 SQL(使用占位符)和关联的数据数组,那么这种“重复”就没有问题,因为它已经由生成器处理了。

    如果交易被正确使用 - 无论如何都应该如此! - 然后简单地在循环中调用 INSERT,每对调用一次,可能会有类似的性能。这避免了需要自己构建动态 SQL(带有占位符),但会增加延迟,因为每个命令都需要往返 SQL 服务器。

    如果发现一堆这样的重复,可能是时候使用数据访问层来隐藏这些细节了;编写它,测试它,然后做一些有趣的事情。


    回应关于使用 SQL 变量的评论:

    虽然以下内容不会提高性能,但@v 的值可能大得离谱,并使代码更难理解 - 应该可以在单个代码中使用 user-defined variables插入语句。例如,考虑:

    INSERT INTO t VALUES (@v := ?, ?), (@v, ?), (@v, ?)
    

    这是"valid" in MySQL(也是 MySQL 特定的),其中占位符是有效的表达式;它是否有效取决于在准备好的语句中如何/是否允许这种绑定。

    【讨论】:

    • 感谢您澄清这一点。我有一个功能可以删除任何重复,所以这不是问题。但是我主要关心的是脚本的执行时间,因为一次可能插入数百行。有什么建议可以使这个过程尽可能高效吗?提前致谢
    • @user3908399 我会首先用一个简单的循环和在循环之外(并包含)循环和所有插入使用事务来编写它。然后测试性能 - 如果足够,我会保留它。如果不是,我会找出原因。组合插入可以减少处理来自服务器的多个命令(并等待响应)的开销,这与更高延迟的连接有很大的不同,但这可能不是相关因素或问题。现在,如果有数万行..
    • 嗯...我想这是我当时唯一的选择。最后一件事要让我明白这一点..没有任何方法可以在 SQL 本身中存储变量并在值上使用变量?示例:INSERT INTO example_table (column_A, column_B) VALUES(some_variable, ?), VALUES(some_variable, ?), VALUES(some_variable, ?);
    • @user3908399 这是一个有趣的想法。我在我的回复中添加了一段摘录。然而,我相信这些尝试试图解决一个不存在或存在于别处的问题。
    • 谢谢它的工作! :) 还有一件事是这种方法并发安全吗?
    【解决方案2】:

    您可以尝试制作一个临时表:

    $query='CREATE TEMPORARY TABLE tempTable(column_B VARCHAR(50));';
    $mysqli->query($query);
    

    然后将 column_B 的唯一值插入此表中

    最后

    $query="INSERT INTO example_table (column_A, column_B) select $a , column_B from tempTable";
    $mysqli->query($query);
    

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 2015-03-02
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多