background image

  那么替代方案是什么呢?

 

使用 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

  <?php
  require_once("DB.php");
  function add_user( $name, $pass )
  {
  $dsn = 'mysql://root:password@localhost/good_genid';
  $db =& DB::Connect( $dsn, array() );
  if (PEAR::isError($db)) { die($db->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。该代码比最初的版本及其相关模式要简单得多,

且效率更高。
 

 

  问题 3:使用多个数据库
  偶尔,我们会看到一个应用程序中,每个表都在一个单独的数据库中。在非常大的数
据库中这样做是合理的,但是对于一般的应用程序,则不需要这种级别的分割。此外,不
能跨数据库执行关系查询,这会影响使用关系数据库的整体思想,更不用说跨多个数据
库管理表会更困难了。