五个常见PHP数据库问题(二)

文章作者 100test 发表时间 2007:03:26 17:58:59
来源 100Test.Com百考试题网


问题 2:不使用自动增量功能

与大多数现代数据库一样,MySQL 能够在每记录的基础上创建自动增量惟一标识符。除此之外,我们仍然会看到这样的代码,即首先运行一个 SELECT 语句来找到最大的 id,然后将该 id 增 1,并找到一个新记录。清单 3 展示了一个示例坏模式。


清单 3. Badid.sql

DROP TABLE IF EXISTS users.

CREATE TABLE users (

  id MEDIUMINT,

  login TEXT,

  password TEXT

).



INSERT INTO users VALUES ( 1, jack, pass ).

INSERT INTO users VALUES ( 2, joan, pass ).

INSERT INTO users VALUES ( 1, jane, pass ).


这里的 id 字段被简单地指定为整数。所以,尽管它应该是惟一的,我们还是可以添加任何值,如 CREATE 语句后面的几个 INSERT 语句中所示。清单 4 展示了将用户添加到这种类型的模式的 PHP 代码。


清单 4. Add_user.php

getMessage()). }



  $res = $db->query( "SELECT max(id) FROM users" ).

  $id = null.

  while( $res->fetchInto( $row ) ) { $id = $row[0]. }



  $id  = 1.



  $sth = $db->prepare( "INSERT INTO users VALUES(?,?,?)" ).

  $db->execute( $sth, array( $id, $name, $pass ) ).



  return $id.

}



$id = add_user( jerry, pass ).



var_dump( $id ).

?>


add_user.php 中的代码首先执行一个查询以找到 id 的最大值。然后文件以 id 值加 1 运行一个 INSERT 语句。该代码在负载很重的服务器上会在竞态条件中失败。另外,它也效率低下。

那么替代方案是什么呢?使用 MySQL 中的自动增量特性来自动地为每个插入创建惟一的 ID。更新后的模式如下所示。


清单 5. Goodid.php

DROP TABLE IF EXISTS users.

CREATE TABLE users (

  id MEDIUMINT NOT NULL AUTO_INCREMENT,

  login TEXT NOT NULL,

  password TEXT NOT NULL,

  PRIMARY KEY( id )

).



INSERT INTO users VALUES ( null, jack, pass ).

INSERT INTO users VALUES ( null, joan, pass ).

INSERT INTO users VALUES ( null, jane, pass ).


我们添加了 NOT NULL 标志来指示字段必须不能为空。我们还添加了 AUTO_INCREMENT 标志来指示字段是自动增量的,添加 PRIMARY KEY 标志来指示那个字段是一个 id。这些更改加快了速度。清单 6 展示了更新后的 PHP 代码,即将用户插入表中。


清单 6. Add_user_good.php

getMessage()). }



  $sth = $db->prepare( "INSERT INTO users VALUES(null,?,?)" ).

  $db->execute( $sth, array( $name, $pass ) ).



  $res = $db->query( "SELECT last_insert_id()" ).

  $id = null.

  while( $res->fetchInto( $row ) ) { $id = $row[0]. }



  return $id.

}



$id = add_user( jerry, pass ).



var_dump( $id ).

?>


现在我不是获得最大的 id 值,而是直接使用 INSERT 语句来插入数据,然后使用 SELECT 语句来检索最后插入的记录的 id。该代码比最初的版本及其相关模式要简单得多,且效率更高。



相关文章


五个常见PHP数据库问题(六)
五个常见PHP数据库问题(五)
五个常见PHP数据库问题(四)
五个常见PHP数据库问题(三)
五个常见PHP数据库问题(二)
五个常见PHP数据库问题(一)
如何测试和调试Apache服务器
用开源软件Subversion进行个人文档管理
Linux系统核心源程序的文件组织结构
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛