如果不存在新行,则更新mysql表

时间:2014-05-15 22:51:21

标签: 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 here as a json object
            dataType: "html",

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


        });

我也有mysql数据库:enter image description here

现在我需要将带有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);

一切都很好。

现在我遇到了问题。 我必须检查值$_POST['ajdi']是否在表格列id_parcele中,如果它只是用json的值更新表格列$_POST['mapData'],如果POST['ajdi']在表格列id_parcele中不存在,那么我需要添加包含上述数据的新行...

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

2 个答案:

答案 0 :(得分:4)

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

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。 http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

答案 1 :(得分:4)

您可以使用以下单个查询(只要在id_parcele上放置一个唯一键)执行此操作:

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

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

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

  

REPLACE的工作方式与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。请参见第13.2.5节“INSERT语法”。

replace INTO map (id_parcele, json, user_id)
VALUES (:1,:2,:3)

但是,您需要在id_parcele上拥有主键或唯一索引。

区别在于replace into语法只会先删除旧行,然后在查询值中插入任何内容 - 而on duplicate...语法允许您执行类似添加计数器的操作通过使用其中的值,查看该行发生了多少次更新:

假设您的原始行在名为parcel_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_updates字段中将计数增加一。

编辑:索引

add an index到已存在的表,您需要在这些类型的命令起作用之前运行这样的(仅一次):

CREATE unique INDEX parcelID ON map (id_parcele);

这将不允许多个行具有id_parcele的相同值。但是,您应该确保您不会多次使用相同的值。您还可以在创建表格时define a column as unique(以供将来参考):

create table map(
id_parcele int(10) unique key,
// etc etc