那么替代方案是什么呢?
使用 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:使用多个数据库
偶尔,我们会看到一个应用程序中,每个表都在一个单独的数据库中。在非常大的数
据库中这样做是合理的,但是对于一般的应用程序,则不需要这种级别的分割。此外,不
能跨数据库执行关系查询,这会影响使用关系数据库的整体思想,更不用说跨多个数据
库管理表会更困难了。