繁体   English   中英

检查行是否存在更新的更好方法,否则插入新记录

[英]Better way to check if row exist update else insert new record

如果行存在更新或插入新记录,写查询的最佳方法是什么? 我正在尝试下面列出的垃圾代码:

<?php
for ($i = 0; $i < ($_POST['count']); $i++) {
    $form_details_subquestion_id = $_POST['form_details_subquestion_id'][$i];
    $form_details_section_id = $_POST['form_details_section_id'][$i];
    $mark = $_POST['mark'][$i];
    $remark = $_POST['remark'][$i];

    $result = $db->query("
        SELECT * 
        FROM audit_section_markrecord 
        WHERE 
          form_details_subquestion_id = $form_details_subquestion_id AND 
          audit_section_no = $audit_no
    ");
    if ($result->num_rows == 1) {
        $query2 = "
            UPDATE audit_section_markrecord 
            SET 
                mark = '$mark', 
                dateofmodify = '$date' 
            WHERE 
              form_details_subquestion_id = '$form_details_subquestion_id' AND 
              audit_section_no = '$audit_no'
        ";
        $result2 = $db->query($query2);

        $query3 = "
            INSERT INTO markrecord_update_details (
                audit_section_no,
                form_details_subquestion_id, 
                form_details_section_id, 
                mark,
                userlog,
                ipaddress
            ) VALUES (
                '$audit_no', 
                '$form_details_subquestion_id', 
                '$form_details_section_id', 
                '$mark', 
                '$user_staff', 
                '$ip'
            )
        ";
        $result3 = $db->query($query3);
    } else if ($result->num_rows == 0) {
        $query4 = "
            INSERT INTO audit_section_markrecord (
                audit_section_no,
                form_details_subquestion_id, 
                form_details_section_id, 
                mark
            ) VALUES (
                '$audit_no', 
                '$form_details_subquestion_id', 
                '$form_details_section_id', 
                '$mark'
            ) 
        ";
        $result4 = $db->query($query4);
    } else {
        echo "<script>alert('Error. Please contact IT support.')</script>";
        echo "<script language='javascript'>window.location.href='index.php'</script>";
    }
}

上面的代码在for循环中编写。 我尝试获取是否存在form_details_subquestion_id和audit_no,然后更新旧记录并插入到markrecord_update_details;否则插入新记录。

我不知道如何使用最容易的代码。 我只是尝试从这次旅程中学习。

最好的方法是在重复的密钥更新上插入

第一次查询的说明。

/* execute this directly in MySQL to add unique key constraint*/
ALTER TABLE audit_section_markrecord
ADD UNIQUE(form_details_subquestion_id, audit_section_no);

/* this query is for calling from php */
INSERT INTO audit_section_markrecord
SET
  /* try to insert value */
  mark = '$mark', 
  dateofmodify = '$date',
  form_details_subquestion_id = '$form_details_subquestion_id',
  audit_section_no = '$audit_no'

/* if constraint check fails, i.e. */
/* there is a row with this form_details_subquestion_id and audit_section_no */
/* then just update mark and dateofmodify */
ON DUPLICATE KEY UPDATE
  mark = '$mark', 
  dateofmodify = '$date';

PS转义您的数据,以防止SQL注入

P.S2。 要检查它是否有效,请在MySQL中运行2个查询:

INSERT INTO audit_section_markrecord
SET
  mark = 'good', 
  dateofmodify = '2015-11-10',
  form_details_subquestion_id = 10,
  audit_section_no = 23;

INSERT INTO audit_section_markrecord
SET
  mark = 'good', 
  dateofmodify = '2015-11-10',
  form_details_subquestion_id = 10,
  audit_section_no = 23
ON DUPLICATE KEY UPDATE
  mark = 'excellent', 
  dateofmodify = '2015-11-26';

行应具有mark = excellent和dateofmodify = 2015-11-26。

P.S3。 如果要插入重复的行,则添加唯一键会出现问题。 看一下SHOW CREATE TABLE audit_section_markrecord。 (感谢Barmar )。

另一种方法是使用REPLACE语句。 它的工作方式类似于INSERT语句,但是当它尝试插入记录时,如果存在具有相同键的记录,则将删除旧记录并插入新记录。 由于您不是基于以前的值进行更新,因此这可能更容易工作。

用户将需要DELETE权限,这样才能起作用。

例:

$query4 = "REPLACE INTO `audit_section_markrecord` (audit_section_no,form_details_subquestion_id, form_details_section_id, mark) VALUES 
    ('$audit_no', '$form_details_subquestion_id', '$form_details_section_id', '$mark') ";

@Andrew,看来我已经了解您的需求。

仅当audit_section_markrecord已更新(未插入)时,才想更新markrecord_update_details

您可以通过两列的组合检查是否需要更新: form_details_subquestion_idaudit_section_no

似乎您的代码工作正常。 使用它,不要使事情复杂化。

我建议您推迟倾斜的“简便方法”来工作。 添加数据转义以防止sql注入并放松。

PS当您准备就绪时,谷歌“ mysql触发更新”,“唯一键”和“重复键更新”(我的上一个示例对此有一定基础)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM