一意の ID を使用せずにレコードが存在しない場合はレコードを挿入したいのですが、ここでこの回答を見つけました: MySQL: テーブルに存在しない場合はレコードを挿入します。
私の場合、テーブルがあります:
+----+---------+---------+---------+---------+-----------+-------------+-----------+
| ID | dRelIns | vRelIns | dRelDel | vRelDel | cRelAktiv | iRelDateiId | iRelKatId |
+----+---------+---------+---------+---------+-----------+-------------+-----------+
| 1 | blabla | blabla | NULL | NULL | J | 3 | 5 |
+----+---------+---------+---------+---------+-----------+-------------+-----------+
| 2 | blabla | blabla | blabla | blabla | N | 3 | 1 |
+----+---------+---------+---------+---------+-----------+-------------+-----------+
| 3 | blabla | blabla | NULL | NULL | J | 3 | 2 |
+----+---------+---------+---------+---------+-----------+-------------+-----------+
ID iRelKatIdとID iRelDateiIdの配列 ($_POST) を取得しています。ID が既に存在するかどうかを確認し、cRelAktiv = 'J' でない場合は、新しい ID を挿入します。エントリが存在するがリストにない場合は、cRelAktiv を「N」に設定します。
SQLクエリを使用した私のPHPスクリプト:
$list=implode("','", $_POST["kat"]);
$sql="UPDATE tabRel_UDK SET dRelDel=NOW(),
vRelDel=USER(),
cRelAktiv='N'
WHERE iRelDateiId='$_POST[id]' AND cRelAktiv='J' AND iRelKatId NOT IN('$list')";
$result = mysql_query($sql) or die(Error (" . mysql_error() . ").");
foreach ($_POST["kat"] as $value) {
$sql="INSERT INTO tabRel_UDK (dRelIns, vRelIns, cRelAktiv, iRelDateiId, iRelKatId)
SELECT * FROM (SELECT NOW(), USER(), 'J', '$_POST[id]','$value') AS tmp
WHERE NOT EXISTS (
SELECT iRelDateiId,iRelKatId,cRelAktiv FROM tabRel_UDK
WHERE iRelDateiId = '$_POST[id]' AND iRelKatId='$value' AND cRelAktiv='J') LIMIT 1;";
$result = mysql_query($sql) or die("Error (" . mysql_error() . ").");
}
このスクリプトは私にとっては機能しますが、両方の ID が同じ値 (たとえば 5) の場合、重複した列名 '5' というエラーがスローされます。SELECT * FROM (SELECT NOW(), USER(), 'J', '$_POST[id]','$value')
それを機能させる方法はありますか、または2〜3個のSQLクエリを作成し、PHPでIDを手動で確認する必要がありますか?