根据另一列的值插入重复记录

时间:2012-07-10 01:11:21

标签: mysql zend-framework

我有一个名为Student的数据库表,其列为idnameageid是主键,name不为空,age可以为空

我想在php中实现以下功能,Zend: 如果name值不同,则只在数据库中添加重复的学生age

在函数/ action addStudentAction中,我调用了Student模型的函数 - findStudent来实现这个要求:

public function findStudent($name)
{
    $result = null;

    $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
    ->setIntegrityCheck(false)
    ->where('student.name = ?', $name);

    //error_log($select->assemble());

    $result = $this->getAdapter()->fetchRow($select);

    return $result;
}

public function addStudentAction() {
    $data = $_POST;
    $studentModel = new Application_Model_Student;
    $result = $studentModel->findStudent($data['name']);

    if(!empty($result)) { 
        error_log("found student name in db, going to get age");

       //Check for age
       if( (!empty($result['age'] )) {
             if( $result['age'] != $data['age']) {
                  error_log("going to add student as new record");
                  return $this->insert($data);
             }
             else {
                  error_log("not adding new student record ");
             }
       }
    }
}

现在,可能有多个学生的记录具有相同的nameage个{{1}}。因此,在添加新学生时,我需要比较年龄所有记录(如果名称匹配)与传入的年龄值。

实施此要求的最佳方法是什么?非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:0)

最简单的方法是在名称上创建复合UNIQUE索引,然后在age字段中创建。 UNIQUE允许多个NULL值,因此这不是问题。根据您的数据库大小和使用情况,这可能不是最受欢迎的选项,在这种情况下,在INSERT之前简单地选择学生信息以检查他/她是否已经在那里将是最好的解决方案。

如果我需要详细说明,请告诉我。我很乐意给你一些例子。

答案 1 :(得分:0)

如何使用名称和年龄进行新的SELECT:

public function findStudentWithAge($name, $age =null)
{
    $result = null;

    $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
    ->setIntegrityCheck(false)
    ->where('student.name = ?', $name);
    if($age) $select->where('student.age = ?', $age);

    //error_log($select->assemble());

    $result = $this->getAdapter()->fetchRow($select);

    return $result;
}

现在在addStudentAction中:

public function addStudentAction() {
    $data = $_POST;
    $studentModel = new Application_Model_Student;
    $result = $studentModel->findStudent($data['name'], $data['age']);

    if(!empty($result)) { 
        error_log("found student with this age, cannot add the record");
    } else {
        $this->insert($data);
    }
}