php - 增加新行的值

标签 php mysql innodb

鉴于 Web 应用程序中的表格设计:

CREATE TABLE `invoice` (
  `invoice_nr` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `revision` int(10) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`invoice_nr`,`revision`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci

插入新发票修订并取回分配的修订号的最方便、最可靠的方法是什么?

第一个明显的方法让我觉得在共享环境中不可靠:

SELECT MAX(revision)+1 AS next_revision -- E.g. 2
FROM invoice
WHERE invoice_nr = 31416;

INSERT INTO invoice (invoice_nr, revision)
VALUES (31416, 2);

这个替代方案看起来稍微更好(我不知道它是否真的更好):

INSERT INTO invoice (invoice_nr, revision)
SELECT 31416, MAX(revision)+1
FROM invoice
WHERE invoice_nr = 31416;

...但除非运行新查询,否则我无法知道修订号:

SELECT MAX(revision) AS last_revision
FROM invoice
WHERE invoice_nr = 31416;

有推荐的方法吗?

应用程序在 PHP 上运行,具有良好的旧 mysql 扩展 -mysql_query() 等。

最佳答案

Mysql 有一个名为 last_insert_id() 的函数,它返回最后一个自动生成的 ID。因此,您可以在插入数据后直接SELECT last_insert_id()

PHP 有一个内置函数来执行此操作,称为 mysql_insert_id()

更多信息请参见:http://www.php.net/manual/en/function.mysql-insert-id.php

虽然这都是真的并且通常很有用,但实际上并不是这里要寻找的东西。我的做法是生成表格。第一个称为带有自动增量字段的发票,第二个称为invoice_revisions。这应该与添加了视野字段的发票表具有相同的格式。

然后,当您更新发票表时,您首先要做的是:

插入发票_修订版 SELECT i.*,IFNULL(max(ir.revision),0)+1 AS 修订版 FROM 发票 i 左连接发票修订版 ir 上 ir.invoice_nr = i.invoice_nr WHERE i.invoice_nr = ?

然后照常更新您的发票表。这样,您就可以在发票表中获得最新数据,并在invoice_revisions 表中获得所有先前版本的列表。

请注意,如果您使用 Myisam 表,请在该表中的 auto_increment 处设置修订版:

http://dev.mysql.com/doc/refman/5.5/en/example-auto-increment.html

关于php - 增加新行的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3101427/

相关文章:

php - AJAX 调用在没有明显原因的情况下破坏 session

php - Codeigniter 迁移 mysql 到 mysqli 连接错误

php - over() 子句出错 am 根据 id 计算 mysql 中下一个或上一个值的行

php - 连接到数据库执行持久的 php 代码

MySQL InnoDB 文本搜索选项

JavaScript 检查总和是否正确

php - 使用 $wpdb->prepare() 时出错

php - 在 Yii 中使用 CD 命令时,如何将两列连接为一列,并且它们之间有一个空格?

mysql - 为什么我不能在 MySQL 5 InnoDB 中将新行插入到部分锁定的表中?

mysql - 什么是 MySQL 数据库引擎?