Object Oriented Style
Insert Or Update If Already Present
(Update if primary keys are not unique)
$stmt = $maindb->prepare("
INSERT INTO my_table
(
MyColumn1,
MyColumn2
) VALUES (
?,
?
)
ON DUPLICATE KEY UPDATE
MyColumn1 = ?,
MyColumn2 = ?
");
$stmt->bind_param("sisi", $MyColumn1, $MyColumn2, $MyColumn1, $MyColumn2);
$MyColumn1 = "abc";
$MyColumn2 = 12;
$stmt->execute();
$stmt->close();
Insert Or Update If Already Present WHERE
You can ‘t use WHERE with ON DUPLICATE KEY UPDATE. A typical solution is to use a double operation instead, INSERT IGNORE followed by and UPDATE WHERE
Insert or Do Nothing If Already Present
(Checks to see if primary keys are unique)
$stmt = $maindb->prepare("
INSERT IGNORE INTO my_table
(
MyColumn1,
MyColumn2
) VALUES (
?,
?
)");
$stmt->bind_param("si", $MyColumn1, $MyColumn2);
$MyColumn1 = "abc";
$MyColumn2 = 12;
$stmt->execute();
$AffectedRows = $stmt->affected_rows;
$stmt->close();
ON DUPLICATE KEY DELETE FROM
No you can’t do a delete!
Procedural Style – Old PHP4 Code
Insert Or Update If Already Present
$result = @mysql_query("
INSERT INTO my_table (
some_int,
some_string
) VALUES (
$my_int,
'$my_string'
)
ON DUPLICATE KEY UPDATE
some_int = $my_int,
some_string = '$my_string'
");
Insert or Do Nothing If Already Present
This simply tests to see if primary keys are unique:
$result = @mysql_query("
INSERT IGNORE INTO my_table (
some_int,
some_string
) VALUES (
$my_int,
'$my_string'
)");
If you have an auto column (e.g. a primary index that’s just a record ID say) then the above won’t work because that column will have a new value and so the new row is not a duplicate – result is a new row is added. To solve this you need to add a UNIQUE index to the table. A unique index can have multiple columns creating it so you simply add the columns you want to never be duplicated to this. MySQL tools will typically let you do this – look for ‘Indexes’ and then for one you can create with multiple columns and that allows its type to be set to unique.