用PEAR::MDB2 Manager模块控制表
时间:2006-07-12 来源:夜猫子
PEAR::MDB2除了提供PEAR::DB已有的sql处理功能之外,还提供了一个非常强大的扩展功能:添加/删除/修改数据库对象
可以控制的数据库对象有:
* 库
* 表
* 索引(普通索引、主键、唯一索引)
调用Manager模块$mdb->loadModule('Manager');
或者直接用魔法调用方式
$mdb->mgCreateTable();
$mdb->mgAlterTable();
模块调用机制参看《
PEAR::MDB2模块调用机制
》
创建数据库$mdb->createDatabase($dbname);
建立数据库很简单,只要指定数据库名字就好,可惜的是,创建新数据库时不能指定更多的参数,比如postgresql建立数据库时还可以指定encoding、owner等等。
定义字段MDB2把字段的数据类型抽象为:
* text 字符类型
* clob 大对象(文本)
* blob 大对象(二进制)
* integer 整数
* boolean 布尔类型
* date 日期类型(YY-MM-DD)
* time 时间类型(HH:MM:SS)
* timestamp 日期加时间(YYYY-MM-DD HH:MM:SS)
* float 浮点数类型
* decimal 任意精度数值类型
字段的参数有:
* length 长度
* type 数据类型
* default 默认值
* unsigned 无符号
* notnull 不允许空值
* fixed 字符类型是否用空格填充不足的长度
例如我想要,创建一个user_info表,包含三个字段:id(编号 整数)、user_name(用户名)、password(MD5密码),字段的描述就是
$fields = array(
'id' => array(
'type' => 'integer',
'notnull' => 1
),
'username' => array(
'type' => 'text',
'length' => 20,
'notnull' => 1
),
'password' => array(
'type' => 'text',
'length' => 32,
'notnull' => 1
)
);
如果给text类型指定length,字段会使用varchar或者char,如果fixed为真则为char,fixed为假则为varchar,fixed默认为false
如果没有给text指定length,使用text类型
某些DBMS可以把默认值设置为函数,比如now(),但是在这里无法设置默认值为函数,如果指定函数默认值,默认值实际上设置成函数运行后的值
创建表创建名字叫user_info的用户信息表
$mdb->createTable('user_info', $fields);
修改表表的修改使用alterTable()方法,可以对表进行的操作有
* name 重命名表名
* add 添加字段
* remove 删除字段
* change 修改字段
* rename 字段重命名
添加字段
给user_info表添加三个字段,realname(真实姓名)、reg_date(注册时间)、login_time(最后一次登录时间)
$change = array(
'add' => array(
'realname' => array(
'type' => 'text',
'length' => 20
),
'reg_date' => array(
'type' => 'timestamp',
'notnull' => 1
),
'login_time' => array(
'type' => 'timestamp'
)
)
);
$mdb->alterTable('user_info', $change);
修改字段
把reg_date字段从timestamp类型改变为date类型,realname不允许为空
$change = array(
'change' => array(
'reg_date' => array(
'type' => 'timestamp',
'definition' => array(
'type' => 'date'
)
),
'realname' => array(
'notnull' => 1
)
)
);
$mdb->alterTable('user_info', $change);
删除字段
删除login_time字段
$change = array(
'remove' => array(
'login_time' => array()
)
);
$mdb->alterTable('user_info', $change);
字段重命名
重命名realname为real_name
$change = array(
'rename' => array(
'realname' => array(
'name' => 'real_name'
)
)
);
$mdb->alterTable('user_info', $change);
重命名表
把user_info表重命名为userinfo
$change = array(
'name' => 'userinfo'
);
$mdb->alterTable('user_info', $change);
创建索引在id字段上创建主键
$con_define = array( // 主键定义
'fields' => array('id' => array()),
'primary' => 1
);
$con_name = 'pk_user_info_id'; // 主键名
$mdb->createConstraint('user_info', $con_name, $con_define);
在username字段上创建唯一索引
$con_define = array( // 唯一索引定义
'fields' => array('username' => array()),
'unique' => 1
);
$con_name = 'uk_user_info_username'; // 唯一索引名
$mdb->createConstraint('user_info', $con_name, $con_define);
删除刚才建立的约束
$mdb->dropConstraint('user_info', 'pk_user_info_id');
$mdb->dropConstraint('user_info', 'uk_user_info_username');
在username、password上建立双字段索引
$idx_define = array(
'fields' => array(
'username' => array(),
'password' => array()
)
);
$idx_name = 'idx_user_info_auth';
$mdb->createIndex('user_info', $idx_name, $idx_define);
删除idx_user_info_auth索引
$mdb->dropIndex('user_info', 'idx_user_info_auth');
Manager模块对一些通常的操作进行了封装,可以满足大部分常见的需求,但是如果你需要是更加精细的控制,Manager就无法做到了,比如:
// PostgreSQL
CREATE INDEX code_idx ON films(code) TABLESPACE indexspace
最后建议有疑惑的时候看还是看看相关的代码,代码就是最好的文档
相关阅读 更多 +