【问题标题】:Prevent duplicate values into mysql database - if certain colums are similar to the last inserted row防止重复值进入 mysql 数据库 - 如果某些列与最后插入的行相似
【发布时间】:2025-12-15 05:40:01
【问题描述】:

您好,我正在将纬度、经度值插入数据库。

INSERT INTO `Tracks` (`Latitude`, `Longitude`, `Time`, `Date`, `Speed`) VALUES ('$Latitude', '$Longitude', '$UTC_Time', '$UTC_Date', '$Speed');

gps 接收器倾向于多次发送相同的 lat、long 值。在插入之前,我试图检查最后插入行的 lat long 列,如果它们匹配,则不应执行查询.否则应该执行查询。我目前无法做到这一点!如果数据库中没有行并且代码检查最后插入的行怎么办?

此外,用户稍后可能会再次来到同一位置,因此我们不应该检查整个数据库是否有重复的 lat、long 值。那我该怎么做呢?我可以在不检查数据库的情况下在 php 本身中执行此操作吗?有什么想法/建议吗?提前致谢!

【问题讨论】:

  • 我会按照您的建议在 PHP 中执行此操作。如果您有会话,只需将最后一个值存储在那里。
  • 嘿,我该怎么做?像这样? if($_SESSION['Latitude'] == $Latitude && $_SESSION['Longitude'] == $Longitude) { $_SESSION['Latitude'] = $Latitude; $_SESSION['经度'] = $经度; } else {query} $_SESSION['Latitude'] 和 $_SESSION['Longitude'] 的初始值是多少..??
  • 那个代码没问题。最初,该值将是未定义的 (NULL)。查询后,还要设置会话变量。
  • 是的,非常感谢!我会接受这个作为答案,但这是一个评论!

标签: php mysql duplicates latitude-longitude


【解决方案1】:

如果你使用 MySQL,我能想到的一件事就是改变

INSERT INTOTracks(Latitude,Longitude,Time,Speed) > VALUES ('$Latitude', '$Longitude', '$UTC_Time', '$UTC_Date', '$Speed');

进入

INSERT IGNORE INTOTracks(Latitude,Longitude,Time,Speed) > VALUES ('$Latitude', '$Longitude', '$UTC_Time', '$UTC_Date', '$Speed');

并使用这两个字段(纬度和经度)设置PRIMARY KEY

由于您指定without checking the db 是我能想到的唯一解决方案。 如果您尝试插入一对相等的Langitude, Latitude INSERT IGNORE 语句将被忽略。

【讨论】:

  • 是的!但是当用户在一段时间后来到同一个地方时,我可能会尝试插入相同的 lat long 值。在这种情况下,必须插入这些值并且不应忽略!
  • 这可以通过在主键中添加一些字段来解决,例如,经纬度、经度和日期,将防止您在同一天内重复。
【解决方案2】:

我可以在不检查数据库的情况下在 php 本身中执行此操作吗?

如果您想检查值是否已经存在,您将不得不以一种或另一种方式查询数据库。

您可以在最后一条记录上执行SELECT 并在 PHP 中比较它的值,或者您可以尝试将值插入数据库,如果值已经存在,则选择忽略插入。

【讨论】:

  • no.. 我们可以尝试将 lat long 值放在一些临时 php 变量中,并根据新的 lat long 值检查它们。如果它们匹配,则不会执行查询。这里唯一的问题是我将如何初始化临时变量?!
【解决方案3】:

使用替换而不是插入。您必须使列在数据库中必须是唯一的。

此外,您使用 mysql 的方式存在巨大的安全风险。 您至少可以使用mysql_real_escape_string。更好的是查看准备好的语句。

【讨论】:

  • 表格不必是唯一的……你可以多次来到同一个地方。如果该列是唯一的......它会说你只来过一次......