Php 更新mysql表,如果行不存在,则添加新的

Php 更新mysql表,如果行不存在,则添加新的,php,jquery,mysql,ajax,pdo,Php,Jquery,Mysql,Ajax,Pdo,首先,我有js/jquery/ajax代码: $('#sacuvajMapu').click(function (e) { $.ajax({ url: "insertMap.php", type: "POST", async: true, data: { ajdi:ajdi, mapData:$('#mapData').val();}, //your form data to post goes

首先,我有js/jquery/ajax代码:

$('#sacuvajMapu').click(function (e) {
 $.ajax({
            url: "insertMap.php",
            type: "POST",
            async: true, 
            data: { ajdi:ajdi, mapData:$('#mapData').val();}, //your form data to post goes here as a json object
            dataType: "html",

            success: function(data) {
            console.log(data);
            } 
            error: function(data) {
            console.log(data);
            }
        });
        });


        });
我还有mysql数据库:

现在,我需要使用ajax代码将数据插入数据库,因此我编写:

      try {        
            $STH = $db->prepare("INSERT INTO map (id_parcele, json, user_id)
VALUES (:1,:2,:3);");

            $STH->bindParam(':1', $_POST['ajdi']);
            $STH->bindParam(':2', $_POST['mapData']);
            $STH->bindParam(':3', $user_id);
一切都好

现在我有一个问题。 我必须检查值
$\u POST['ajdi']
是否在表列
id\u parcele
中,如果只是用
$\u POST['mapData']
中的值更新表列
$\u POST['ajdi']
中的值,并且如果表列
id\u parcele
中不存在
id\u parcele,那么我需要用上面的数据添加新行

我怎么能做到?
正确的方法是什么?

假设已经存在的记录将抛出主键冲突,您可以执行以下操作:

INSERT INTO map (id_parcele, json, user_id)
VALUES (:1,:2,:3)
on duplicate key update json=values(json), user_id=values(user_id)

此语法是特定于MySQL的

您可以通过单个查询(只要在
id\u parcele
上放置一个唯一的键)执行此操作,并执行以下操作:

INSERT INTO map (id_parcele, json, user_id, parcel_updates)
VALUES (:1,:2,:3,0)
on duplicate key update parcel_updates=parcel_updates+1

如果只想每次替换值,也可以使用语法:

REPLACE的工作原理与INSERT完全相同,只是如果表中的一个旧行与主键或唯一索引的新行具有相同的值,则在插入新行之前会删除旧行。参见第13.2.5节“插入语法”

不过,您同样需要在
id\u parcele
上有一个主键或唯一索引

不同之处在于,
replace-into
语法将首先删除旧行,然后插入查询值中的任何内容,而
on-duplicate…
语法允许您通过使用该行中的值添加计数器来查看该行发生了多少次更新:

假设您的原始行是在名为
parcel\u updates
的字段中用0创建的(并且有这样一列),您可以执行以下操作:

INSERT INTO map (id_parcele, json, user_id, parcel_updates)
VALUES (:1,:2,:3,0)
on duplicate key update parcel_updates=parcel_updates+1
这将保持原始值不变,但在
parcel\u updates
字段中将计数增加1

编辑:索引

要访问已存在的表,您需要在这些类型的命令生效之前运行类似的操作(仅运行一次):

CREATE unique INDEX parcelID ON map (id_parcele);
这样一来,
id\u parcele
就不允许有多行具有相同的值。但是,您应该确保其中没有多次具有相同的值。您还可以在创建表时(供将来参考):


您可以使用
rowCount()
检查行是否存在。这是一个选项。在mysql中,您可以指定一个
insert。。。在重复密钥更新时
如果密钥已存在,则将更新行的语法+1、关于更换
的优点。我还要添加一条注释,说明DELETE操作(如果发生)将触发表上的任何DELETE触发器,并且(如果InnoDB引擎)将调用任何引用外键的
on DELETE
规则(级联、设置NULL、限制)。(您指定将执行删除操作;我只想强调这是一个真正的删除操作。可能与OP无关,但在更一般的情况下,我们需要注意一些事情。我写下:try{$STH=$db->prepare(“INSERT-INTO-map(id\u-parcele,json,user\u-id)值(:1,:2,:3)在重复键更新时,json=values(json),user_id=values(user_id);$STH->bindParam(':1',$\u POST['ajdi']);$STH->bindParam(':2',$\u POST['mapData']);$STH->bindParam(':3',$user_id);但再次添加与新行相同的数据…@gmaestro我做了一次编辑,解释了如何在表上创建一个唯一的索引,以便这些SQL查询能够为您工作。谢谢,但我是在phpmyAdmin中完成的,非常感谢您的帮助。我写了以下内容:try{$STH=$db->prepare(“插入到映射(id\parcele,json,user\id)值(:1,:2,:3)在重复键更新时,json=values(json),user_id=values(user_id);$STH->bindParam(':1',$\u POST['ajdi']);$STH->bindParam(':2',$\u POST['mapData']);$STH->bindParam(':3',$user_id);但再次添加与新行相同的数据…id_parcele设置是否作为主键?否,正如您从我的主id上方的照片中看到的,id_parcele必须是唯一的?是。如果在列列表中未包含唯一id,则此方法无效。当我尝试将其设为主键时,我得到:1075-不正确的表定义;只能有一个自动列和必须将其定义为密钥
CREATE unique INDEX parcelID ON map (id_parcele);
create table map(
id_parcele int(10) unique key,
// etc etc