Z-BlogPHP SQL(二)

本文内容仅适用于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(一)

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录