MySQL:如果定义的行相同,则不要插入新行

时间:2013-12-27 15:22:59

标签: php mysql sql

我有一张表,我可以获得采样值:AeroSamples

id    time    temperature    pressure    humidity

我在5分钟时间内对值进行采样。在将新行插入表格之前,我检查最后一行的温度,压力和湿度值是否与当前值相同。如果是这样,我不想添加新行。否则可以添加新记录。

我这样做:

SELECT temperature, pressure, humidity FROM AeroSamples ORDER BY id DESC LIMIT 1

当我得到最后的值时,我将三个字段与当前值进行比较,这是我不喜欢的方式:

if($row["temperature"] !== $curTemp || $row["pressure"] !== $curPres || $row["humidity"] !== $curHumi)
{
    $db->prepare("INSERT INTO AeroSamples (temperature, pressure, humidity) VALUES(:t,:p,:h)");
    ...
}

我该如何只使用这个SQL?

ON DUPLICATE KEY UPDATE ...会帮助我吗?我不这么认为。因为我不确定它是否一次对多个字段有效。

2 个答案:

答案 0 :(得分:4)

以前的值是相同的,因为时间不同。唉。

您可以使用insert . . . select语法执行此操作。我们的想法是选择插入的最后一行并使用where子句来过滤行。当值相同时,过滤器将不返回任何行(因此没有插入):

insert into AeroSamples(temperature, pressure, humidity) 
    select :t, :p, :h
    from (select temperature, pressure, humidity
          from AeroSamples
          order by id desc
          limit 1
         ) as1
    where as1.temperature <> :t or as1.pressure <> :p or as1.humidity <> :h;

答案 1 :(得分:0)

要使用ON DUPLICATE,您需要为表添加唯一索引。

create unique index aerosamples_ux1 on AeroSamples(temperature, pressure, humidity);

你可以在查询中使用ON DUPLICATE KEY UPDATE或ON DUPLICATE KEY IGNORE ...同时请记住,如果你不使用ON DUPLICATE,你的查询会给你一个错误,并且在添加这个后不会添加重复的记录索引。