引用MySQL INSERT手册 - 同样适用于UPDATE:
使用关键字DEFAULT将列显式设置为其默认值.这使得编写INSERT语句更容易,这些语句将值分配给除了几列之外的所有列,因为它使您能够避免编写不包含表中每列的值的不完整VALUES列表.否则,您必须写出与VALUES列表中每个值对应的列名列表.
所以简而言之,如果我写
INSERT INTO table1 (column1,column2) values ('value1',DEFAULT);
Run Code Online (Sandbox Code Playgroud)
将插入了将column2设置为其默认值的新行 - 无论它是什么.
但是,如果我在PHP中准备并执行语句:
$statement = $pdoObject->
prepare("INSERT INTO table1 (column1,column2) values (?,?)");
$statement->execute(array('value1','DEFAULT'));
Run Code Online (Sandbox Code Playgroud)
如果列能够存储文本值,则新行将包含"DEFAULT"作为其文本值.
现在我已经为PDO编写了一个抽象层(我需要它)并且考虑引入一个问题来解决这个问题
const DEFAULT_VALUE = "randomstring";
Run Code Online (Sandbox Code Playgroud)
所以我可以执行这样的语句:
$statement->execute(array('value1',mysql::DEFAULT_VALUE));
Run Code Online (Sandbox Code Playgroud)
然后在执行绑定的方法中,我将查看发送到绑定的值,如果某些值相等self::DEFAULT_VALUE,则相应地执行操作.
我很确定有更好的方法来做到这一点.还有其他人遇到类似情况吗?
我有以下代码片段:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < 100000; i++) {
preparedStatement.setObject(1, someValue);
preparedStatement.addBatch();
if ((i + 1) % 100 == 0) {
preparedStatement.executeBatch();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想用不同的值执行一次大约10万次的命令.我的问题是:每次调用executeBatch()后,PreparedStatement中的参数是清除的还是我必须在调用executeBatch()之后显式调用preparedStatement.clearParameters()以确保只执行最后100个命令?
在npm文档中,只有可见的预处理语句用于插入.这些准备好的语句是否适用于选择,更新和删除?
我试过select,没有一个.each函数可以回调行.任何人都可以这样做或有资源链接,因为我可以肯定无法找到任何.
想知道我如何将PHP预处理语句的结果绑定到一个数组中然后我怎么去调用它们.例如这个查询
$q = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$q->bind_param("s", $user);
$q->execute();
Run Code Online (Sandbox Code Playgroud)
这将返回结果的用户名,电子邮件和ID.想知道我是否可以将它绑定在一个数组中,然后将其存储在一个变量中,以便我可以在整个页面中调用它?
我一直在学习为我的sql查询使用预备语句和绑定语句,到目前为止我已经提出了这个问题,但是它工作正常但是当涉及到多个参数或者当不需要参数时它根本不是动态的,
public function get_result($sql,$parameter)
{
# create a prepared statement
$stmt = $this->mysqli->prepare($sql);
# bind parameters for markers
# but this is not dynamic enough...
$stmt->bind_param("s", $parameter);
# execute query
$stmt->execute();
# these lines of code below return one dimentional array, similar to mysqli::fetch_assoc()
$meta = $stmt->result_metadata();
while ($field = $meta->fetch_field()) {
$var = $field->name;
$$var = null;
$parameters[$field->name] = &$$var;
}
call_user_func_array(array($stmt, 'bind_result'), $parameters);
while($stmt->fetch())
{
return $parameters;
//print_r($parameters);
}
# close statement
$stmt->close();
}
Run Code Online (Sandbox Code Playgroud)
这就是我调用对象类的方式,
$mysqli = new …Run Code Online (Sandbox Code Playgroud) 我对Oracle JDBC驱动程序处理CHAR数据类型有一个棘手的问题.我们来看看这个简单的表:
create table x (c char(4));
insert into x (c) values ('a'); -- inserts 'a '
Run Code Online (Sandbox Code Playgroud)
所以当我插入一些东西时CHAR(4),字符串总是用空格填充.当我执行这样的查询时也会这样做:
select * from x where c = 'a'; -- selects 1 record
select * from x where c = 'a '; -- selects 1 record
select * from x where c = 'a '; -- selects 1 record
Run Code Online (Sandbox Code Playgroud)
这里,常量'a'也用空格填充.这就是记录总是返回的原因.当使用JDBC执行这些查询时,这也PreparedStatement适用.现在最棘手的是当我想使用绑定变量时:
PreparedStatement stmt =
conn.prepareStatement("select * from x where c = ?");
stmt.setString(1, "a"); // This …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用预准备语句将包含日期,时间和时区的字符串插入到我的数据库的时区字段的时间戳中.
问题是Timestamp.valueof函数没有考虑字符串包含的时区,因此它会导致错误.接受的格式是yyyy- [m] m- [d] d hh:mm:ss [.f ...],没有提到时区.
这是导致错误的确切代码:
pst.setTimestamp(2,Timestamp.valueOf("2012-08-24 14:00:00 +02:00"))
有什么方法可以克服它吗?提前致谢!
postgresql timestamp prepared-statement value-of timestamp-with-timezone
我看了很多问题,但显然我的SO-fu不能胜任这个任务,所以我在这里.我试图有效地使用预准备语句,我不仅仅意味着参数化单个语句,而是编译一个语句以便重复使用多次.我的问题在于参数和重用以及如何正确实现.
一般来说,我遵循这个程序(人为的例子):
SqlConnection db = new SqlConnection(...);
SqlCommand s = new SqlCommand("select * from foo where a=@a", db);
s.Parameters.Add("@a", SqlDbType.VarChar, 8);
s.Prepare();
...
s.Parameters["@a"] = "bozo";
s.Execute();
Run Code Online (Sandbox Code Playgroud)
超级,有效.但是,每次运行此查询时,我都不想执行所有这些步骤(或后四个步骤).这似乎抵消了准备陈述的整个想法.在我看来,我只需要更改参数并重新执行,但问题是如何做到这一点?
我试过s.Parameters.Clear(),但这实际上删除了参数本身,而不仅仅是值,所以我基本上需要重新Add参数并再次重复Prepare,这似乎也打破了整个点.不用了,谢谢.
在这一点上,我留下迭代s.Parameters并将它们全部设置为null或其他值.它是否正确?不幸的是,在我目前的项目中,我有大约15个参数的查询需要执行〜每次运行10,000次.我可以将这个迭代分流成一个方法但是想知道是否有更好的方法来做到这一点(没有存储过程).
我目前的解决方法是一个扩展方法,SqlParameterCollection.Nullify它将所有参数设置为null,这对我的情况很好.我只是在执行后运行它.
我发现了一些几乎完全相同但(恕我直言)尚未解答的问题:
SQLite/C#连接池和准备语句混淆(Serge非常接近回答!)
我能找到的最佳答案是(1)上面的常识和(2)这个页面:
Cassandra的Datastax Java驱动程序(cassandra-driver-core 2.0.2)支持PreparedStatements和QueryBuilder API.使用一个优于另一个的任何特定优势?缺点是什么?
文档:http://www.datastax.com/documentation/developer/java-driver/2.0/common/drivers/reference/driverReference_r.html
除了以编程方式编写查询之外,上述doc没有说明使用QueryBuilder API而不是PreparedStatements,这没有多大优势(在我的书中).
请分享您的想法和经验.谢谢.
java prepared-statement cassandra datastax-java-driver cassandra-2.0
我了解到JDBC PreparedStatement和PGBouncer无法一起工作,因为PreparedStatement使用会话池并且是预编译的,PGbouncer使用事务级别池.
我的问题是可以createStatement和PGBouncer一起使用,因为它没有预编译?如果没有,有人可以指向另一个可以连接到数据库并可以使用PGbouncer的Java API吗?