【问题标题】:What is the returned result from a SELECT MAX() when table is empty in MySQL?当 MySQL 中的表为空时,SELECT MAX() 返回的结果是什么?
【发布时间】:2012-08-21 17:24:15
【问题描述】:

我有一张供用户付款的表格。我需要为每笔交易指定一个收据代码,所以我需要知道最后一笔是什么?如果没有以前的收据,我想用 1000 添加第一个收据,其他收据必须是增量的,如 1001, 1002, ...
为此,我写了这段代码:

$receipt = '1000';
$query_receipt = mysql_query("SELECT MAX(receipt) FROM tbl_payments");
$max = mysql_result($query_receipt,0);
if ($max != '0' || $max != '')
{
    $receipt = mysql_result($query_receipt,0) + 1;
}

当我在表中有记录时它工作正常。但是当表为空时它返回 1 。我怎么解决这个问题?即使表为空,我也需要知道 SELECT MAX() ... 的返回值。

【问题讨论】:

  • 如果您需要一个值随着添加的每一行而增加,您应该使用自增列而不是尝试自己生成 id。
  • 您到底需要什么?您不期望 1. 那么当 table 为空时您的预期输出是什么?

标签: php mysql select return-value max


【解决方案1】:

以下内容应作为您的插入语句。不需要像上面那样使用 PHP 来运行两个查询,你可以直接在 MYSQL 中执行相同的结果。

INSERT INTO tbl_payments (receipt)
VALUES 
(
(SELECT CASE WHEN MAX(p.receipt) IS NULL THEN 1000 ELSE MAX(p.receipt)+1 END AS receipt 
    FROM tbl_payments p ORDER BY p.receipt DESC LIMIT 1)
)

【讨论】:

    【解决方案2】:

    我还建议使用 auto_increment 值,并通过 insert_id 确定您当前的收据编号。只需执行您的INSERT-Query,然后使用例如mysqli_insert_id 来获取您插入的付款的ID。

    如果您想从 1000 开始,您可以更改自动增量列的起始值。我发现这可以设置自动增量以从 1000 开始

    ALTER TABLE tbl_name AUTO_INCREMENT = 1000
    

    【讨论】:

      【解决方案3】:

      你得到一个空值:

      mysql> create table noRows (id int(3));
      Query OK, 0 rows affected (0.03 sec)
      
      mysql> select max(id) from noRows;
      +---------+
      | max(id) |
      +---------+
      |    NULL |
      +---------+
      1 row in set (0.00 sec)
      

      但是,您可以使用合并来获得所需的内容:

      mysql> select coalesce(max(id),1) from noRows;
      +---------------------+
      | coalesce(max(id),1) |
      +---------------------+
      |                   1 |
      +---------------------+
      1 row in set (0.01 sec)
      

      编辑:如果您要检查它,用户已经有一个,如果没有,插入一个新行,据我所知,它不能用单个查询来完成,但以下应该有效:

      $receipt = 1000;
      $query_receipt = mysql_query("SELECT MAX(receipt) FROM tbl_payments");
      $num_rows = mysql_num_rows($query_receipt);
      if($num_rows>0)
      {
          // Assumes $ID to be some unique field used to identify your customer stored in field ID.
          $sql="insert into tbl_payments (ID, receipt) values ($ID, $receipt)";
          mysql_result($sql)
      }
      else
      {
          // Do stuff here to get the receipt from the first resultset.
      }
      

      关于这一点,您可能需要考虑放弃旧的已弃用的 mysql_* 函数,而改用 PDO。它更安全,功能也更多。

      【讨论】:

      • 令人印象深刻的人,我也坚持这一点。尝试了这么多,然后尝试 STO,我在这里......谢谢。
      【解决方案4】:

      您可以通过使用IFNULL 来实现此目的:

      SELECT IFNULL(MAX(receipt), 1000) FROM tbl_payments;
      

      【讨论】:

      • 实际上,重新阅读这个问题,我认为如果没有基值为 1000 的行,OP 想要插入一行。我认为这不能用一个查询,但你的 SQL 功夫比我的好 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多