php postgresql检查记录是否已经插入之前

时间:2014-09-18 10:26:24

标签: php postgresql upsert

我无法弄清楚查询语句的正确措辞/语法。我想检查我们的表(名称学校)中是否已有一所与学校名称相符的学校。如果是这样,它已经存在的状态。任何输入都会很棒!

  //create a connection (the connection is made in another php file)
  $obj = new MyConnection();
  $obj->setConn();
  $obj->displayValues();
  $qObj = new MyCode();
  $qObj->setConn( $obj->getConn());

  //Query to put all the school data into db
  $q1 = "INSERT INTO schools(
                 SchoolName,
                 SchoolWebsite,
                 City,
                 State,
                 Locale,
                 Sector,
                 Tuition,
                 GradRate,
                 FacToStudRatio,
                 StudentPop,
                 FreshmenPop,
                 PercentWomen,
                 PercentMen,
                 PercentAdmitted,
                 AverageGpa,
                 AverageScore)

        VALUES ('$SchoolName',
                '$SchoolWebsite',
                '$City',
                '$State',
                '$Locale',
                '$Sector',
                '$Tuition',
                '$GradRate',
                '$FacToStudRatio',
                '$StudentPop',
                '$FreshmenPop',
                '$PercentWomen',
                '$PercentMen',
                '$PercentAdmitted',
                '$AverageGpa',
                '$AverageScore')";


  $findResult = pg_query( 'SELECT * FROM schools WHERE schoolname =.$SchoolName);

  if ($findResult != 0) 
  {
    echo "School Record Already Exists<br/>";
    die;
  }

  $qObj->setQuery($q1);
  $qObj->runQuery();

2 个答案:

答案 0 :(得分:0)

您的代码中缺少'

$findResult = pg_query( 'SELECT * FROM schools WHERE schoolname ='.$SchoolName)
                                                                 ^

答案 1 :(得分:0)

这与"upsert" problem有关 - 它是一个插入 - 如果不存在。这样做比你预期的更难并且非常容易出现竞争条件。

最佳解决方案始终是unique约束或唯一索引。尝试插入,如果出现错误,则表示该行已存在。

替代方法是LOCK TABLE ... IN EXCLUSIVE MODE表,因此您保证没有其他人可以同时在其中插入相同的行。但这并不能很好地扩展。