首先,我有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);
一切都很好。
现在我遇到了问题。
我必须检查值$_POST['ajdi']
是否在表格列id_parcele
中,如果它只是用json
的值更新表格列$_POST['mapData']
,如果POST['ajdi']
在表格列id_parcele
中不存在,那么我需要添加包含上述数据的新行...
我怎么能这样做? 什么是正确的方法?
答案 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