本文內(nèi)容僅適用于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 數(shù)據(jù)庫、表、索引
1、CREATE DATABASE
可以在 mysql 和 pgsql 下創(chuàng)建數(shù)據(jù)庫:
$sql = $zbp->db->sql->get()->create()->database('zbp')->ifnotexists()->sql;
CREATE DATABASE IF NOT EXISTS zbp
2、CREATE TABLE
這里的例子只是 sql 鏈用法的展示,實際上我們已經(jīng)把 sql 鏈的方法包裝好了,用$zbp->db->CreateTable 方法會更便捷。
創(chuàng)建一個表,先定義數(shù)據(jù)結(jié)構:
$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 文件讀取系統(tǒng)的配置
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 數(shù)據(jù)庫、表、索引
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 內(nèi)的參數(shù)可以寫成一個,也可以寫成多個
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統(tǒng)計函數(shù)
在這里我們僅以 COUNT 做為例子,取出每一個作者的文章總數(shù)并分組顯示:
$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 里新增了隨機讀取的功能,同時支持三種數(shù)據(jù)庫
這里舉例隨機取 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 函數(shù)隨機獲取文章的方法:
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 引擎不支持事務,所以安裝時就要選擇數(shù)據(jù)庫引擎為 InnoDB,如果安裝好后可以在 phpmyadmin 里對全部的表進行引擎切換。
更多Z-BlogPHP SQL鏈式操作可參閱:《Z-BlogPHP SQL(一)》