我不习惯处理MySQL,所以如果我使用的语法或术语不正确,请原谅我。
我正在为多个日期举办的活动建立一个表格,人们可以在预定的日期保留自己的位置,自己以及来自同一地址的其他9个人。当用户提交表单时,我会抓取地址,邮政编码,他们选择的日期以及每个注册人的姓名。
我正在尝试将它们保存在MySQL中但我想避免重复如果所有值已经存在连续。
到目前为止,每个解决方案都围绕设置一个唯一或主键,但我不能设置一个,因为我可以拥有
基本上,我希望一次避免基于所有字段的重复。
假设我有以下participants
表:
id | nom | prenom | adresse | code_postal | e_date
1 | Doe | John | 1, Main | H0H0H0 | 15-04-2016
2 | Doe | Jane | 15, Main | A1A1A1 | 15-04-2016
如果我得到另一个条目:
3 | Doe | John | 1, Main | H0H0H0 | 15-04-2016
它应不插入它(但可以替换第1行,因为所有列都具有相同的值),但如果我得到类似
的内容3 | Doe | John | 1, Main | H0H0H0 | 16-04-2016
然后它应该将它插入表中,因为至少有一列是不同的。
与
相同3 | Smith | Dan | 1, Main | H0H0H0 | 16-04-2016
我尝试过的唯一两个没有产生任何错误的查询是
INSERT IGNORE
INSERT IGNORE INTO participants(nom,prenom,adresse,code_postal,e_date) VALUES ('$nom','$prenom','$adresse','$codePostal','$date')"
INSERT ... ON DUPLICATE KEY UPDATE
INSERT INTO participants(nom,prenom,adresse,code_postal,e_date) VALUES ('$nom','$prenom','$adresse','$codePostal','$date') ON DUPLICATE KEY UPDATE nom='$nom', prenom='$prenom', adresse='$adresse', code_postal='$codePostal', e_date='$date'
两个查询都会通过,但添加重复项。我错过了什么?
我有点超出我的深度,所以任何建议都表示赞赏。如果我的解释不清楚,请告诉我。谢谢!
感谢@frédéric-h-fournier,我最终得到了这个有效的解决方案:
$checkQuery = "SELECT COUNT(*) AS rowCount FROM participants WHERE nom='$nom' AND prenom='$prenom' AND adresse='$adresse' AND code_postal='$codePostal' AND e_date='$date'";
$checkResult = mysql_query($checkQuery);
if($checkResult){
$row = mysql_fetch_row($checkResult);
if($row[0]==0){
$sql = "INSERT INTO participants(nom,prenom,adresse,code_postal,e_date) VALUES ('$nom','$prenom','$adresse','$codePostal','$date')";
$result = mysql_query($sql) or die("Could not insert data into DB: " . mysql_error());
}
}
else{
die("Could not insert data into DB: " . mysql_error());
}
答案 0 :(得分:1)
您可以拥有一个独特的INDEX KEY或/和您的PHP代码,您应该像这样查询您的数据库
"SELECT COUNT(*) AS rowCount FROM TABLE WHERE nom = 'Doe'"
And after
if($query['rowCount'] > 0){
// err
}
Ah et aussi,situcréerunUNIQUE INDEX KEY确保toi de le faire dans ton code PHP comme ci-dessus vu quetarequêtesvate retourner un erreur!
答案 1 :(得分:0)
您需要为必须永远不会重复的列添加唯一索引。
CREATE UNIQUE INDEX uix_pub_name ON publishers(pub_name)
答案 2 :(得分:0)
我通常这样做的方法是查询数据库以检查值是否已存在。您始终必须确定表的唯一性。看起来在您的情况下,唯一性在于以下列:id | nom | prenom | adresse | code_postal | e_date。
在这种情况下,在进行插入之前,您可以执行select语句:
select * from participants where id = $id and nom = $nom and prenom=$prenom and adresse = $adresse and code_postal = $code_postal and e_date=$e_date;
如果返回某些内容,请不要插入。如果它没有返回任何内容,那么你可以继续插入。
答案 3 :(得分:0)
也许您可以添加一个包含行的任何哈希函数(SHA1或MD5)结果的列。它可以是一行中所有字段值的连接字符串的哈希结果。
因此,在插入之前,计算哈希结果并从表中查找哈希结果是否存在。如果它不存在,请插入它。
答案 4 :(得分:0)
1)您可以使用所有值运行select查询,并查看是否返回任何记录。
2)仅在未返回记录时插入数据。