引用MySQL INSERT手册-UPDATE也一样:
使用关键字DEFAULT可以将列明确设置为其默认值。这使编写INSERT语句(为少数几个列分配值)更加容易,因为它使您避免编写不完整的VALUES列表,该列表不包含表中每个列的值。否则,您将不得不写出与VALUES列表中的每个值相对应的列名列表。
简而言之,如果我写
INSERT INTO table1 (column1,column2) values ('value1',DEFAULT);
插入新的一列,并将column2设置为其默认值(无论它是多少)。
但是,如果我准备并执行PHP语句:
$statement = $pdoObject->
prepare("INSERT INTO table1 (column1,column2) values (?,?)");
$statement->execute(array('value1','DEFAULT'));
如果该列能够存储文本值,则新行将包含“ DEFAULT”作为其文本值。
现在,我已经为PDO编写了一个抽象层(我需要它),为了解决这个问题,我正在考虑引入一个
const DEFAULT_VALUE = "randomstring";
所以我可以执行这样的语句:
$statement->execute(array('value1',mysql::DEFAULT_VALUE));
然后在执行绑定的方法中,我将检查发送给绑定的值,如果某些值等于self::DEFAULT_VALUE
,则相应地执行操作。
我敢肯定,有更好的方法可以做到这一点。有人遇到过类似情况吗?
我知道的唯一“解决方法”是使用Coalesce()和Default(fieldname)
例如
$pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("
CREATE TEMPORARY TABLE foo (
id int auto_increment,
x int NOT NULL DEFAULT 99,
y DATETIME NOT NULL DEFAULT '2010-03-17 01:00:00',
z varchar(64) NOT NULL DEFAULT 'abc',
primary key(id)
)
");
$stmt = $pdo->prepare('
INSERT INTO
foo
(x,y,z)
VALUES
(
Coalesce(:x, Default(x)),
Coalesce(:y, Default(y)),
Coalesce(:z, Default(z))
)
');
$stmt->bindParam(':x', $x);
$stmt->bindParam(':y', $y);
$stmt->bindParam(':z', $z);
$testdata = array(
array(null, null, null),
array(1, null, 'lalala'),
array(null, '2009-12-24 18:00:00', null)
);
foreach($testdata as $row) {
list($x,$y,$z) = $row;
$stmt->execute();
}
unset($stmt);
foreach( $pdo->query('SELECT id,x,y,z FROM foo', PDO::FETCH_NUM) as $row) {
echo join(', ', $row), "\n";
}
版画
1, 99, 2010-03-17 01:00:00, abc
2, 1, 2010-03-17 01:00:00, lalala
3, 99, 2009-12-24 18:00:00, abc
问题内容: 嗨,我正在尝试学习使用准备好的语句来避免SQL注入等的正确方法。 当我执行脚本时,我从脚本中收到一条消息,提示已插入0行,我希望这表示已插入1行,并且当然会更新表。我不完全确定自己准备好的陈述,因为我已经做过一些研究,我的意思是每个例子都各不相同。 更新表格时,我需要声明所有字段吗?还是只更新一个字段就可以了? 任何信息将非常有帮助。 index.php classes / class
问题内容: 我正在尝试使用Golang sqlx库创建准备好的语句。我想让表名成为bindVar 但是,这给了我一个语法错误。我可以不使用绑定变量作为表名吗? 问题答案: 我可以不使用绑定变量作为表名吗? 不,报价来源。 参数只能用作数据值,不能用作标识符。因此,例如,这是合理的: 但这不起作用: 但是,如果需要,可以使用表名,而将$ 1,$ 2,…保留为数据值。
使用卡桑德拉准备语句时,将字段与静态值绑定是否有任何好处? 例如,即使我总是使用静态值“Active”,status是否也应该有一个bind变量?如果是,为什么? 更新用户设置status='Active',其中user_id=:userid
我是卡珊德拉的新成员。我正在使用Datastax的Cassandra PHP驱动程序。我试图创建具有多个插入的批处理语句。给定表格模型: 我尝试通过两种方式插入以下值: 这会产生错误: 与此同时,我尝试了一种更直接的方法,没有准备好声明: 这样一切都正常,但肯定会慢很多。也许有人能解释一下我正在做的准备好的陈述方法有什么问题? 提前谢谢你。
我正在使用我生成的一个准备好的语句,但在Java抛出的语句上出现了语法错误。然而,当我将PS的toString复制并粘贴到数据库的phpmyadmin中时,它的执行完美无缺。有什么想法会出错吗,我很难理解? 编辑:更改为PS.ExecuteUpdate(查询);还是不起作用。