mysql准备语句设置插入的默认值

时间:2014-09-25 01:45:08

标签: php mysql sql

我有一个包含两列的表,它将一个表的行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行)。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

,它不可能到"别名"一个多次的值。每个占位符都是唯一,并且必须绑定到一个值。 (甚至不可能在PDO中使用命名参数可靠地执行此操作。)

如果动态地(使用占位符)和关联的数据数组自动构建SQL,那么这样的"复制"就没有问题。因为它已由发电机处理过。

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

如果找到一堆这样的重复,可能是时候使用数据访问层来隐藏这些细节了;写下来,测试它,转移到有趣的东西上。


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

虽然以下可以提高性能,但可能除了大量的@v值,并且使代码更难理解 - 应该可以使用user-defined variables单个插入语句。例如,考虑:

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

这是"valid" in MySQL(也是特定于MySQL的),其中占位符是有效的表达式;如果它起作用将取决于如何/如果在准备好的陈述中允许这样的约束。

答案 1 :(得分: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);