本文内容仅适用于1.7 及更高版本!
一、USEINDEX FORCEINDEX IGNOREINDEX
注:本指令是 mysql 专用的,分别是使用索引,强制使用索引,跳过索引
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->useindex('zbp_log_TPISC', 'zbp_log_VTSC') ->sql;
SELECT * FROM zbp_post USE INDEX ( zbp_log_TPISC ,zbp_log_VTSC )
二、SQL INSERT INTO 语句
$sql = $zbp->db->sql->get()->insert($zbp->table['Post']) ->data(array('log_Title' => 'test','log_Type' => '0')) ->sql;
INSERT INTO zbp_post (log_Title,log_Type) VALUES ( 'test' , '0' )
三、SQL UPDATE 语句
$sql = $zbp->db->sql->get()->update($zbp->table['Post']) ->where('=', 'log_ID', 1) ->data(array('log_Title' => 'test','log_Type' => '1')) ->sql;
UPDATE zbp_post SET log_Title = 'test', log_Type = '1' WHERE log_ID = '1'
四、SQL DELETE 语句
$sql = $zbp->db->sql->get()->delete($zbp->table['Post']) ->where('=', 'log_ID', 1) ->sql;
DELETE FROM zbp_post WHERE log_ID = '1'
五、CREATE 数据库、表、索引
1、CREATE DATABASE
可以在 mysql 和 pgsql 下创建数据库:
$sql = $zbp->db->sql->get()->create()->database('zbp')->ifnotexists()->sql;
CREATE DATABASE IF NOT EXISTS zbp
2、CREATE TABLE
这里的例子只是 sql 链用法的展示,实际上我们已经把 sql 链的方法包装好了,用$zbp->db->CreateTable 方法会更便捷。
创建一个表,先定义数据结构:
$tableData = array( 'a' => array('a', 'integer', '', 0, '主ID'), 'i' => array('i', 'boolean', '', false), 'k' => array('k', 'string', 250, ''), 'o' => array('o', 'string', 'longtext', '', '备注为某字段'), 'r' => array('r', 'float', '', ''), ); $sql = $zbp->db->sql->get()->create('zbp_table') ->data($tableData) ->option(array('engine' => 'InnoDB')) ->option(array('charset' => 'utf8mb4')) ->option(array('collate' => 'utf8mb4_general_ci')) ->sql; $zbp->db->query($sql); echo $sql;
SQL 语句输出:
CREATE TABLE IF NOT EXISTS zbp_table ( a int(11) NOT NULL AUTO_INCREMENT COMMENT '主ID', i tinyint(1) NOT NULL DEFAULT '0', k varchar(250) NOT NULL DEFAULT '', o longtext NOT NULL COMMENT '备注为某字段', r float NOT NULL DEFAULT 0, PRIMARY KEY (a) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1
备注:可以指定表的引擎和字符集,如果不指定则从 option 文件读取系统的配置
3、CREATE INDEX
$sql = $zbp->db->sql->get()->create($zbp->table['Post']) ->index( array('zbp_post_index_stt'=>array('log_Status','log_Type','log_Tag')) ) ->sql;
CREATE INDEX zbp_post_index_stt ON zbp_post ( log_Status , log_Type , log_Tag )
六、DROP 数据库、表、索引
1、DROP DATABASE
$sql = $zbp->db->sql->get()->drop()->database('zbp')->sql;
DROP DATABASE zbp
2、DROP TABLE
$sql = $zbp->db->sql->get()->drop()->table('zbp_table2')->ifexists()->sql;
DROP TABLE IF EXISTS zbp_table2
3、DROP INDEX
$sql = $zbp->db->sql->get()->drop('zbp_table')->index('zbp_table_id')->sql;
DROP INDEX zbp_table_id ON zbp_table
七、ALTER修改/添加字段
1、添加字段
$sql = $zbp->db->sql->get()->ALTER($zbp->table['Post']) ->ADDCOLUMN('log_IsHide integer NOT NULL DEFAULT \'0\'') ->ADDCOLUMN('log_CreateTime', 'integer NOT NULL DEFAULT \'0\'') ->ADDCOLUMN('log_Tel', 'varchar(250)') ->ADDCOLUMN('log_Note', 'text', 'NOT NULL') ->sql; // ADDCOLUMN 内的参数可以写成一个,也可以写成多个
ALTER TABLE zbp_post ADD COLUMN log_IsHide integer NOT NULL DEFAULT '0' ,ADD COLUMN log_CreateTime integer NOT NULL DEFAULT '0' ,ADD COLUMN log_Note text NOT NULL
2、修改字段
注:只有 mysql 和 pgsql 支持,sqlite 不能修改字段;
$sql = $zbp->db->sql->get()->ALTER("zbp_post") ->ALTERCOLUMN('log_IsHide INTEGER NOT NULL DEFAULT \'0\'') ->sql;
# mysql 生成 ALTER TABLE zbp_post MODIFY log_IsHide INTEGER NOT NULL DEFAULT '0' # pgsql 生成 ALTER TABLE zbp_post ALTER COLUMN log_IsHide INTEGER NOT NULL DEFAULT '0'
3、删除字段
$sql = $zbp->db->sql->get()->ALTER("zbp_post") ->DROPCOLUMN('log_IsHide') ->DROPCOLUMN('log_CreateTime') ->DROPCOLUMN('log_Note') ->sql;
ALTER TABLE zbp_post DROP COLUMN log_IsHide ,DROP COLUMN log_CreateTime ,DROP COLUMN log_Note
八、SQL统计函数
在这里我们仅以 COUNT 做为例子,取出每一个作者的文章总数并分组显示:
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->column('log_AuthorID') ->count(array('log_ID'=>'num')) ->where(array('=', 'log_Type' ,'0')) ->groupBy('log_AuthorID') ->sql;
SELECT log_AuthorID, COUNT(log_ID) AS num FROM zbp_post WHERE log_Type = '0' GROUP BY log_AuthorID
九、SQL随机取记录
1.7 里新增了随机读取的功能,同时支持三种数据库
这里举例随机取 5 篇文章:
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where('=','log_Type',0) ->random(5) ->sql;
-- mysql 生成的 sql SELECT * FROM zbp_post WHERE log_Type = '0' AND log_ID >= (SELECT FLOOR( RAND() * ( (SELECT MAX(log_ID) FROM `zbp_post`)- (SELECT MIN(log_ID) FROM `zbp_post`)) + (SELECT MIN(log_ID) FROM `zbp_post`))) LIMIT 5 -- pgsql 和 sqlite 生成的 sql SELECT * FROM zbp_post WHERE log_Type = '0' ORDER BY Random() LIMIT 5
使用 GetList 函数随机获取文章的方法:
GetList(null,null,null,null,null,null,array('random'=>5)); // 1.7 以更高版本的GetList加以改进了 GetList(array('random'=>4,'cate'=>1)); // 获取分类1下的随机4篇文章
十、SQL事务处理
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
// 开始一个事务 $zbp->db->sql->get()->transaction('begin')->query; // 中间sql处理 // 提交事务 $zbp->db->sql->get()->transaction('commit')->query;
BEGIN; COMMIT;
注意:MySQL 只有 InnoDB 引擎支持事务,MyISAM 引擎不支持事务,所以安装时就要选择数据库引擎为 InnoDB,如果安装好后可以在 phpmyadmin 里对全部的表进行引擎切换。
更多Z-BlogPHP SQL链式操作可参阅:《Z-BlogPHP SQL(一)》