2014-09-25 64 views
0

我有一个表中有两列,将一个表的行ID链接到另一个表的行ID,基本上我需要能够在这张表上插入多行,列是插入和其他更改的固定值。插入是使用预处理语句在php中完成的,并且插入了未知行数(我已经使用call_user_func_array解决了这部分问题)。mysql准备语句设置插入的默认值

这里是什么,我需要做的一个例子:

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行中的例子)。任何帮助,将不胜感激

回答

0

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

如果自动动态构建SQL(使用占位符)和关联的数据数组,则这样的“重复”没有问题,因为它已经被处理发电机。

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

如果发现一堆这样的重复,它可能是时间使用数据访问层后面的这些细节;写下来,测试一下,转到一些有趣的事情上。


在回答关于使用SQL变量的注释:

虽然下面将提高性能,还可能为除外的@v大得离谱的值,使得代码更难以理解 - 应该可以在单个插入语句中使用user-defined variables。例如,考虑:

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

这是"valid" in MySQL(并且也是MySQL特有),其中占位符有效表达式;如果它有效,将取决于如何/如果准备好的声明中允许这种绑定。

+0

感谢您在清除了。我有一个可以消除重复的功能,所以这不是问题。不过,我最关心的是脚本的执行时间,因为一次可能会插入数百行。任何建议使这个过程尽可能高效?在此先感谢 – user3908399 2014-09-25 02:04:49

+0

@ user3908399我会首先用一个简单的循环*和*来编写它,并使用外部事务(并包含)循环和所有插入事务。然后测试性能 - 如果足够了,我会放弃它。如果不是,我会找出原因。组合插入可以减少处理来自服务器的多个命令(并等待响应)的开销,这与高延迟连接有很大不同,但它可能不是一个相关因素或事项。现在,如果有成千上万的行.. – user2864740 2014-09-25 02:05:52

+0

嗯......我想这是关于我唯一的选择。最后一件事就是要清除我的想法..没有任何方法可以将变量存储在SQL本身中,并在值上使用变量?示例: 'INSERT INTO example_table(column_A,column_B)VALUES(some_variable,?),VALUES(some_variable,?),VALUES(some_variable,?);' – user3908399 2014-09-25 02:10:14

0

您可以尝试做一个临时表:

$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);