我有下表:
CREATE TABLE 'Test' ('Id' INTEGER PRIMARY KEY NOT NULL, 'Val' INTEGER)
如果给定的ID不存在,我想插入具有默认Val的ID。但是,如果它已经存在,我想增加Val的值。
我有以下代码:
$data = array(':id'=>$id);
$stmt = $db->prepare('INSERT INTO Test (Id, Val) Values(:id, 1);');
if(!$stmt->execute($data)){
$stmt = $db->prepare('UPDATE Test SET Val=Val+1 WHERE Id=:id');
$stmt->execute($data);
}
并且它可以工作,但是我想用一个SQL语句来完成。我可以吗?
编辑 :
从@ Xikinho90的答案,我的最终代码是
$stmt = $db->prepare('
INSERT OR REPLACE INTO Test (Id,Val)
VALUES ( :id, COALESCE((SELECT Val + 1 FROM Test WHERE id = :id), 1) )
');
$stmt->execute(array(':id'=>$id));
您可以使用插入或替换。
我认为这可以解决问题
INSERT OR REPLACE INTO Test (Id,Val)
VALUES ( 1,
COALESCE((SELECT Val + 1 FROM Test WHERE id = 1), 1)
);
INSERT OR REPLACE INTO Test (Id,Val)
VALUES ( 2,
COALESCE((SELECT Val + 1 FROM Test WHERE id = 2), 1)
);
您只需要用输入的ID替换数字
谢谢奇科
问题内容: 我从谷歌搜索开始,发现这篇文章讨论了互斥表。 我有一张约有1400万条记录的表。如果我想以相同的格式添加更多数据,是否有一种方法可以确保我要插入的记录在不使用一对查询的情况下就不存在(即,要检查的一个查询和要插入的一个查询是结果集是空的)? 字段上的约束是否可以确保如果该约束已经存在,该约束将失败? 似乎 只有 一个约束条件,当我通过php发出插入命令时,脚本就发出了嘎嘎叫声。 问题答
问题内容: 我有一个带有2个表的数据库,如下所示: 列是,并且是 和 在申请表中,我有2个编辑框,名称分别为和 如果用户像电子邮件一样插入一个新的负责人姓名, 那么在保存表格的过程中,我想将新的负责人姓名插入表中,请插入最后一个并将其更新为。 如果用户保持名称,但它更新电子邮件一样,然后我想在从1 =使用新的电子邮件地址和他们(其余和)保持不变。 如果负责人的名称相同,我想保留from表的原始引用
问题内容: 我在下面有一个SQL插入程序,它工作正常,但是我希望它检查DATE = xxxx,NAME = xxxx和JOB = xxx并更新HOURS(如果它们存在),否则插入新行。SQL可以做到这一点吗? 尝试以下具有相同结果的OR替换,每次都会添加一个新行。 例如: 如果以下内容位于数据库中,并且John要更新其工作时间,它将检查名称,日期,作业是否与尝试插入的值相同,并且它们是否仅更新HO
问题内容: 我在使用SQL查询时遇到问题。如果同一行尚不存在,我需要插入一行。这是我到目前为止的内容: 我对sql不太熟悉,尤其是不存在的语法,因此在执行时会出现以下错误: ORA-06550:第37行,第11列:PLS-00103:在预期以下情况之一时遇到了符号“ INSERT”: 然后和或 用“ then”符号代替“ INSERT”继续。 following: the following: 问
问题内容: 我是mysql的新手。我在将记录插入到table1中时遇到问题,如果它在table2中不存在。我有2个表table1和table2形式: 我试图仅在table2的“开始”和“停止”列中不存在值时才将值插入到table1的开始和停止字段值中。如果存在,我需要抛出一个错误。这些表没有主键外键关系。抱歉,我不知道正确的语法,但是我必须在mysql和PHP中执行类似的操作。 在插入到table
问题内容: 是否有只查询记录的查询,如果不存在,则插入?我不想重复更新或替换。寻找一个查询解决方案,寻找其他答案,但不是我真正想要的。 表: 伪查询: 问题答案: 使用-与INSERT完全相同,不同之处在于,如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前会删除该旧行。 http://dev.mysql.com/doc/refman/5.0/en/rep