仅在验证数据后才插入数据在目标表中尚不存在

时间:2013-06-06 14:00:43

标签: php mysql foreach sql-update

我正在制作一个脚本,以自动将车辆放置或“生成”到在线游戏(“DayZ”)中。我有一个表格,其中包含我想要添加到游戏世界的位置和车辆类型,但是我需要确保在要插入的位置不存在车辆。如果确实如此,我会跳过在该位置插入新车辆。

最初我打算收集所有要添加的位置和车辆的记录集,然后循环遍历每个位置以确定该位置是否已被占用。

$sql = "SELECT location, vehicle_type from vehicles_to_add";
foreach ($conn->query($sql) as $row)
{
  // Query the database to see if $row['location'] already exists 
  // in the vehicle_location table
  if EXISTS then
    Do not add
  else
    Add vehicle and location to the vehicle_location table
}

然而,在看了一些例子之后,我想知道是否可以通过SQL完成某些事情。例如......可能类似于:

INSERT INTO vehicle_location
SELECT location, vehicle_type FROM vehicles_to_add

使用SQL的好处是我可以在数据库中创建一个自己运行的事件。但是,使用此SQL ONLY方法我不确定如何在添加其他车辆之前检查该位置是否已存在。

2 个答案:

答案 0 :(得分:1)

确保首先在表格中设置车辆类型的唯一键(否则重复键子句无效)

create unique index vehicle_typekey on vehicle_location(location);

然后您可以使用单个insert语句来插入或更新

insert into vehicle_location select v.location, v.vehicle_type 
FROM vehicles_to_add v on duplicate key update vehicle_type=v.vehicle_type;

答案 1 :(得分:0)

我认为您可以在查询中使用ON DUPLICATE KEY UPDATE

INSERT INTO vehicle_location (a,b) SELECT v.location, v.vehicle_type FROM vehicles_to_add v
  ON DUPLICATE KEY UPDATE a=v.location; --you can add here to update any columns