仅当所有字段与另一行不同时,如何在数据库中插入行

时间:2016-04-12 01:15:16

标签: php mysql database

我不习惯处理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());
}

5 个答案:

答案 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)仅在未返回记录时插入数据。