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


php postgresql check if record already before inserting

我无法找出查询语句的正确措辞/语法。我想检查一下我们的表中是否已经有一所学校(命名学校)与学校名称匹配。如果是,则表示该状态已存在。任何投入都会很棒!

  //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();

您的代码中缺少'

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

这与"upstart"问题有关——如果不存在,那就是插入。这样做比你预期的要困难,而且很容易受到比赛条件的影响。

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

另一种选择是LOCK TABLE ... IN EXCLUSIVE MODE表,因此您可以保证没有其他人可以同时向其中插入相同的行。不过,这并不能很好地扩展。