Mysql中Update和Delete返回值的问题

前言

我们都知道update和delete语句返回的是我们修改的行数,那么在jpa和mybatis中是如果实现的呢,请看下面

当然我们也可以设置为void,这是无所谓的,因为有了返回值(int ,Integer都可以),我不要也可以啊,这与我们自己的业务逻辑有关系

1、jpa



public interface DemoEntityRepository extends CrudRepository<DemoEntity,Long> {
   
    
    

    /**
     * 更新字段,判断更新了几条数据 ,没有 resultType
     */
    @Modifying
    
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1、SqlConnection类   构造函数:SqlConnection(connstr);   属性:  Database//获取当前数据库或连接打开后要使用的数据库的名称        Connectionstring//获取或设置用于打开 SQL Server 数据库的字符串   方法:  Open()        Close()        Dispose()//释放所有资源         2、SqlCommand类     构造函数:SqlCommand(string,conn) 属性:  CommandType//获取或设置一个值,该值指示如何解释 CommandText 属         CommandText //获取或设置要对数据源执行SQL 语句         Connection//获取或设置 SqlCommand 的此实例使用的 SqlConnection         Parameters//获取 SqlParameterCollection。参数集合 方法:  ExecuteNonQuery(): 返回受影响函数,如增、删、改操作;         ExecuteScalar():执行查询,返回首行首列的结果;         ExecuteReader():返回一个数据流(SqlDataReader对象)。   实例1: SqlCommand cmd = new SqlCommand () cmd.connection =conn; cmd.CommandType = CommandType.Text; cmd.CommandText ="select *from produce=@ID"; cmd.Parameters.Add("@ID",SqlDBType.NVarChar,10,ID).values=1; cmd.ExecuteScalar();   实例2:   SqlCommand cmd = new SqlCommand (“select *from test”,conn);   cmd.ExecuteScalar(); 注意: ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1,对于这种更新操作 用我们平时所用的是否大于0的判断操作应该没有问题而且比较好,但是对于其他的操作如对数据库结构的操作,如果操作成功时返回的却是-1,这种情况跟我们平时的思维方式有点差距所以应该好好的注意了, 3、SqlDataReader类   是由ExecuteReader()返回一个数据流(SqlDataReader对象)没有构造方法   属性:Connection//获取与 SqlDataReader 关联的 SqlConnection。      FieldCount//获取当前行的列数。      HasRows//获取一个值,该值指示 SqlDataReader 是否包含一行或多行      RecordsAffect//获取执行 Transact-SQL 语句所更改、插入或删除的行数   方法:Read();//使 SqlDataReader 前进到下一条记录      GetType();//获取当前实例的 Type      NextResult();//当读取批处理 Transact-SQL 语句的结果时,使数据读取器前进到下一个结果 4、SqlDataApater类   构造方法:SqlDataApater()        SqlDataAdapter(SqlCommand)//初始化 SqlDataAdapter 类的新实例,用指定的 SqlCommand 作为 SelectCommand 的属性。        SqlDataApater(string,conn)//使用 SelectCommand 和 SqlConnection 对象初始化 SqlDataAdapter 类的一个新实例   属性:  DeleteCommand        SelectCommand        InsertCommand        UpdataCommand              方法:  Fill(DataSet)//在 DataSet 添加或刷新行        Fill(DataTable)//在 DataSet 的指定范围添加或刷新行,以与使用 DataTable 名称的数据源的行匹配。 (继承自DbDataAdapter。        Update(DataRow[])//通过为 DataSet 的指定数组的每个已插入、已更新或已删除的行执行相应的 INSERT、UPDATEDELETE 语句来更新数据库的值        Update(DataSet)//通过为指定的 DataTable 的每个已插入、已更新或已删除的行执行相应的 INSERT、UPDATEDELETE 语句来更新数据库的值        Update(DataTable) 实例1   // 隐藏了SqlCommand对象的定义,同时隐藏了SqlCommand对象与SqlDataAdapter对象的绑定 SqlDataAdapter myda= new SqlDataAdapter("select * from test",conn);   实例2   SqlCommand mySqlCommand = new SqlCommand();// 创建SqlCommand   mySqlCommand.CommandType = CommandType.Text;   mySqlCommand.CommandText = "select * from product";   mySqlCommand.Connection = sqlCnt;   SqlDataAdapter myDataAdapter = new SqlDataAdapter();   // 创建SqlDataAdapter   myDataAdapter.SelectCommand = mySqlCommand; // 为SqlDataAdapter对象绑定所要执行的SqlCommand对象 5、DataSet类     命名空间:System.Data.DataSet。   数据集,本地微型数据库,可以存储多张表。  //使用DataSet第一步就是将SqlDataAdapter返回的数据集(表)填充到Dataset对象:   SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt); DataSet myDataSet = new DataSet(); // 创建DataSet myDataAdapter.Fill(myDataSet, "product"); // 将返回的数据集作为“表”填入DataSet,表名可以与数据库真实的表名不同,并不影响后续的增、删、改等操作 //访问dataset的数据 DataTable myTable = myDataSet.Tables["product"]; foreach (DataRow myRow in myTable.Rows) { foreach (DataColumn myColumn in myTable.Columns) { Console.WriteLine(myRow[myColumn]); //遍历表的每个单元格 } } // 修改DataSet DataTable myTable = myDataSet.Tables["product"]; foreach (DataRow myRow in myTable.Rows) { myRow["name"] = myRow["name"] + "商品"; } // 将DataSet的修改提交至“数据库” SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter); myDataAdapter.Update(myDataSet, "product"); // 添加一行 DataRow myRow = myTable.NewRow(); myRow["name"] = "捷安特"; myRow["price"] = 13.2; //myRow["id"] = 100; id若为“自动增长”,此处可以不设置,即便设置也无效 myTable.Rows.Add(myRow); // 将DataSet的修改提交至“数据库” SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter); myDataAdapter.Update(myDataSet, "product"); // 删除第一行 DataTable myTable = myDataSet.Tables["product"]; myTable.Rows[0].Delete(); SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter); myDataAdapter.Update(myDataSet, "product");
MySQL文参考手册.chm449kb0 译者序 1 MySQL的一般的信息1.1 什么是MySQL? 1.2 关于本手册1.2.1 本手册使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5 MySQL稳定性? 1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 2 MySQL 邮件列表及如何提问或报告错误2.1 MySQL邮件列表 2.2 提问或报告错误 2.3 怎样报告错误或问题 2.4 在邮件列表上回答问题的指南 3 MySQL的许可证和技术支持3.1 MySQL的许可证政策 3.2 MySQL 使用的版权3.2.1 可能的未来版权改变 3.3 MySQL商业性分发 3.4 许可证实例3.4.1 销售使用 MySQL的产品 3.4.2 销售MySQL相关的服务 3.4.3 ISP MySQL服务 3.4.4 运营一个使用MySQL的Web服务器 3.5 MySQL的许可证和技术支持费用3.5.1 付款信息 3.5.2 联系信息 3.6 商业性支持的类型3.6.1 基本的电子邮件支持 3.6.2 扩展的电子邮件支持 3.6.3 登录支持 3.6.4 扩展的登录支持 4 安装 MySQL 4.1 怎样获得MySQL 4.2 MySQL支持的操作系统 4.3 使用MySQL哪个版本 4.4 怎样和何时发布更新版本 4.5 安装布局 4.6 安装MySQL二进制代码分发4.6.1 Linux RPM注意事项 4.6.2 构造客户程序 4.6.3 系统特定的问题4.6.3.1 Linux 注意事项 4.6.3.2 HP-UX 注意事项 4.7 安装 MySQL源代码分发4.7.1 快速安装概述 4.7.2 运用补丁 4.7.3 典型的configure选项 4.8 编译问题? 4.9 MIT-pthreads 注意事项 4.10 Perl 安装说明4.10.1 在Unix操作系统上安装 Perl 4.10.2 在 Win32上安装 ActiveState Perl 4.10.3 在 Win32 上安装 MySQL Perl 分发 4.10.4 使用 Perl DBI/DBD接口遇到的问题 4.11 系统特定的问题4.11.1 Solaris注意事项 4.11.2 Solaris 2.7 注意事项 4.11.3 Solaris x86 注意事项 4.11.4 SunOS 4 注意事项 4.11.5 Linux (所有的Linux版本)注意事项4.11.5.1 Linux-x86 注意事项 4.11.5.2 RedHat 5.0 注意事项 4.11.5.3 RedHat 5.1 注意事项 4.11.5.4 Linux-SPARC 注意事项 4.11.5.5 Linux-Alpha 注意事项 4.11.5.6 MkLinux 注意事项 4.11.5.7 Qube2 Linux 注意事项 4.11.6 Alpha-DEC-Unix 注意事项 4.11.7 Alpha-DEC-OSF1 注意事项 4.11.8 SGI-Irix 注意事项 4.11.9 FreeBSD 注意事项 4.11.10 NetBSD 注意事项 4.11.11 BSD/OS 注意事项4.11.11.1 BSD/OS 2.x 注意事项 4.11.11.2 BSD/OS 3.x 注意事项 4.11.11.3 BSD/OS 4.x 注意事项 4.11.12 SCO 注意事项 4.11.13 SCO Unixware 7.0 注意事项 4.11.14 IBM-AIX 注意事项 4.11.15 HP-UX 注意事项 4.12 Win32 注意事项4.12.1 在 Win32 上安装 MySQL 4.12.2 在 Win95 /Win98上启动 MySQL 4.12.3 在 NT 上启动 MySQL 4.12.4 在 Win32 上运行 MySQL 4.12.5 用 SSH 从 Win32 连接一个远程MySQL 4.12.6 MySQL-Win32与Unix MySQL 比较 4.13 OS/2 注意事项 4.14 TcX 二进制代码 4.15 安装后期(post-installation)的设置与测试4.15.1 运行mysql_install_db 的问题 4.15.2 启动 MySQL 服务器的问题 4.15.3 自动启动和停止 MySQL 4.15.4 选项文件 4.16 升级和降级(downgrading)时有什么特别要做的事情吗?4.16.1 从一个 3.22 版本升级到 3.23 4.16.2 从一个 3.21 版本升级到 3.22 4.16.3 从一个 3.20 版本升级到 3.21 4.16.4 升级到其他的体系结构 5 MySQL 与标准的兼容性?5.1 MySQL对ANSI SQL92 的扩充 5.2 以ANSI模式运行 MySQL 5.3 MySQL相比ANSI SQL92的差别 5.4 MySQL 缺乏的功能5.4.1 子选择(Sub-selects) 5.4.2 SELECT INTO TABLE 5.4.3 事务(Transactions) 5.4.4 存储过程和触发器 5.4.5 外键(Foreign Keys)5.4.5.1 不使用外键的理由 5.4.6 视图(Views) 5.4.7 '--'作为一个 注解的开始 5.5 MySQL 遵循什么标准? 5.6 怎样处理没有提交/回卷(COMMIT / ROLLBACK) 6 MySQL 存取权限系统6.1 权限系统做什么 6.2 MySQL用户名和口令 6.3 与MySQL服务器连接 6.4 使你的口令安全 6.5 MySQL 提供的权限 6.6 权限系统工作原理 6.7 存取控制,阶段1:连接证实 6.8 存取控制,阶段2:请求证实 6.9 权限更改何时生效 6.10 建立初始的 MySQL权限 6.11 向MySQL增加新用户权限 6.12 怎样设置口令 6.13 存取拒绝(Access Denied)错误的原因 6.14 怎样使MySQL安全以对抗解密高手(cracker) 7 MySQL 语言参考7.1 文字:怎样写字符串和数字7.1.1 字符串 7.1.2 数字 7.1.3 十六进制值 7.1.4 NULL值 7.1.5 数据库,表,索引,列和别名的命名7.1.5.1 名字的大小写敏感性 7.2 用户变量 7.3 列类型7.3.1 列类型的存储要求 7.3.5 数字类型 7.3.6 日期和时间类型7.3.6.1 问题和日期类型 7.3.6.2 DATETIME,DATE和TIMESTAMP类型 7.3.6.3 TIME类型 7.3.6.4 YEAR类型 7.3.7 字符串类型7.3.7.1 CHAR和VARCHAR类型 7.3.7.2 BLOB和TEXT类型 7.3.7.3 ENUM类型 7.3.7.4 SET类型 7.3.8 为列选择正确的类型 7.3.9 列索引 7.3.10 多列索引 7.3.11 使用来自其他数据库引擎的列类型 7.4 用在SELECT和WHERE子句的函数7.4.1 分组函数 7.4.2 常用的算术运算 7.4.3 位函数 7.4.4 逻辑运算 7.4.5 比较运算符 7.4.6 字符串比较函数 7.4.7 类型转换运算符 7.4.8 控制流函数 7.4.9 数学函数 7.4.10 字符串函数 7.4.11 日期和时间函数 7.4.12 其他函数 7.4.13 与GROUP BY子句一起使用的函数 7.5 CREATE DATABASE (创建数据库)句法 7.6 DROP DATABASE (抛弃数据库)句法 7.7 CREATE TABLE (创建表)句法7.7.1 隐含(silent)的列指定变化 7.8 ALTER TABLE (改变表)句法 7.9 OPTIMIZE TABLE (优化表) 句法 7.10 DROP TABLE (抛弃表)句法 7.11 DELETE (删除)句法 7.12 SELECT (精选)句法 7.13 JOIN (联接)句法 7.14 INSERT (插入)句法 7.15 REPLACE (替换)句法 7.16 LOAD DATA INFILE (装载数据到文件)句法 7.17 UPDATE (更新)句法 7.18 USE (使用)句法 7.19 FLUSH (清除缓存)句法 7.20 KILL (杀灭)句法 7.21 SHOW (显示)句法(得到关于表,列等的信息) 7.22 EXPLAIN (解释)句法(得到关于SELECT的信息) 7.23 DESCRIBE (描述)句法(得到列的信息) 7.24 LOCK TABLES/UNLOCK TABLES (锁定表/解锁表)句法 7.25 SET OPTION (设置选项)句法 7.26 GRANT (授权)和REVOKE (撤回)句法 7.27 CREATE INDEX (创建索引)句法 7.28 DROP INDEX (抛弃索引)句法 7.29 注释句法 7.30 CREATE FUNCTION/DROP FUNCTION (创建函数/抛弃函数)句法 7.31 MySQL对保留字很挑剔吗? 8 MySQL 教程8.1 联接和断开服务器 8.2 输入查询 8.3 常用查询的例子8.3.1 列的最大值 8.3.2 拥有某个列的最大值的行 8.3.3 列的最大值:按组:只有值 8.3.4 拥有某个字段的组间最大值的行 8.3.5 使用外键 8.4 创建并使用一个数据库8.4.1 创建并选用一个数据库 8.4.2 创建一个数据库表 8.4.3 将数据装入数据库表 8.4.4 从一个数据库表检索信息8.4.4.1 选择所有数据 8.4.4.2 选择特定行 8.4.4.3 选择特定列 8.4.4.4 排序行 8.4.4.5 日期计算 8.4.4.6 NULL值操作 8.4.4.7 模式匹配 8.4.4.8 行计数 8.4.5 使用多个数据库表 8.5 获得数据库和表的信息 8.6 以批处理模式使用mysql 8.7 从"双胞项目"查询8.7.1 找出所有非独处的双胞胎 8.7.2 显示关于双胞胎近况的表 9 MySQL 服务器功能9.1 MySQL 支持哪些语言?9.1.1 用于数据和排序的字符集 9.1.2 增加一个新的字符集 9.1.3 多字节字符支持 9.2 更新日志 9.3 MySQL数据库表可以有多大? 9.4 MySQL数据库表类型 10 从 MySQL 得到最大的性能10.1 优化概述 10.2 系统/编译时和启动参数的调节10.2.1 编译和链接如何影响 MySQL 的速度 10.2.2 磁盘问题10.2.2.1 为数据库和表格使用符号链接 10.2.3 调节服务器参数 10.2.4 MySQL 怎样打开和关闭数据库表 10.2.5 在同一个数据库创建大量数据库表的缺点 10.2.6 为什么有这么多打开的表? 10.2.7 MySQL 怎样使用内存 10.2.8 MySQL 怎样锁定数据库表 10.2.9 数据库表级锁定的问题 10.3 使你的数据尽可能小 10.4 MySQL 索引的使用 10.5 存取或更新数据的查询速度10.5.1 估计查询性能 10.5.2 SELECT 查询的速度 10.5.3 MySQL 怎样优化WHERE子句 10.5.4 MySQL 怎样优化LEFT JOIN 10.5.5 MySQL 怎样优化LIMIT 10.5.6 INSERT查询的速度 10.5.7 UPDATE查询的速度 10.5.8 DELETE查询的速度 10.6 选择一种表类型10.6.1 静态(定长)表的特点 10.6.2 动态表的特点 10.6.3 压缩表的特点 10.6.4 内存(In-memory table)表的特点 10.7 其他优化技巧 10.8 使用你自己的基准测试 10.9 设计选择 10.10 MySQL 设计局限/折衷 10.11 可移植性 10.12 我们已将MySQL用在何处? 11 MySQL 基准套件 12 MySQL 实用程序12.1 各种 MySQL 程序概述 12.2 管理一个 MySQL 服务器 12.3 从 MySQL 数据库和表倒出(dump)结构和数据 12.4 从文本文件导入数据 12.5 MySQL 压缩只读表生成器 13 维护 MySQL 安装13.1 使用myisamchk进行表维护和崩溃恢复13.1.1 myisamchk的调用语法 13.1.2 myisamchk的内存使用 13.2 13.2 建立一个数据库表维护规范 13.3 获得关于一个表的信息 13.4 使用myisamchk进行崩溃恢复13.4.1 怎样检查表的出错 13.4.2 怎样修复表 13.4.3 表优化 13.5 日志文件维护 14 为MySQL增加新函数14.1 增加一个新的用户定义函数14.1.1 UDF调用顺序 14.1.2 参数处理 14.1.3 返回值和出错处理 14.1.4 编译并安装用户定义函数 14.2 增加一个新的原生(native)函数 15 为MySQL增加新过程15.1 analyse过程 15.2 编写一个过程 16 MySQL对 ODBC 支持16.1 MyODBC 支持的操作系统 16.2 怎样报告 MyODBC的问题 16.3 已知可用 MyODBC一起工作的程序 16.4 怎样填写 ODBC 管理程序的各种域 16.5 怎样在ODBC获得一个AUTO_INCREMENT列的值 16.6 报告 MyODBC 的问题 17 与一些常用程序一起使用MySQL17.1 与 Apache一起使用 MySQL 18 问题和常见的错误18.1 如果 MySQL总是崩溃怎么办 18.2 使用 MySQL 时一些常见错误18.2.1 MySQL server has gone away错误 18.2.2 Can't connect to [local] MySQL server错误 18.2.3 Host '...' is blocked错误 18.2.4 Out of memory错误 18.2.5 Packet too large错误 18.2.6 The table is full错误 18.2.7 Commands out of sync in client错误 18.2.8 Ignoring user错误 18.2.9 Table 'xxx' doesn't exist错误 18.3 MySQL 怎样处理一个溢出的磁盘 18.4 怎样从一个文本文件运行SQL命令 18.5 MySQL 在哪儿存储临时文件 18.6 怎样保护"/tmp/mysql.sock"不被删除 18.7 Access denied 出错 18.8 怎样作为一个一般用户运行 MySQL 18.9 怎样重新设置一个忘记的口令 18.10 文件许可权限问题 18.11 文件没找到 18.12 使用DATE列的问题 18.13 时区问题 18.14 在搜索的大小写敏感性 18.15 NULL值问题 18.16 alias问题 18.17 从相关的表删除行 18.18 解决没有匹配行的问题 18.19 ALTER TABLE问题 18.20 怎样改变一个表列的次序 19 解决MySQL 一些常见的问题19.1 数据库复制 19.2 数据库备份 19.3 在同一台机器上运行多个 MySQL 服务器 20 MySQL 客户工具和 API20.1 MySQL C API 20.2 C API数据类型 20.3 C API函数概述 20.4 C API函数描述20.4.1 mysql_affected_rows () 20.4.2 mysql_close () 20.4.3 mysql_connect () 20.4.4 mysql_change_user () 20.4.5 mysql_create_db () 20.4.6 mysql_data_seek () 20.4.7 mysql_debug () 20.4.8 mysql_drop_db () 20.4.9 mysql_dump_debug_info () 20.4.10 mysql_eof () 20.4.11 mysql_errno () 20.4.12 mysql_error () 20.4.13 mysql_escape_string () 20.4.14 mysql_fetch_field () 20.4.15 mysql_fetch_fields () 20.4.16 mysql_fetch_field_direct () 20.4.17 mysql_fetch_lengths () 20.4.18 mysql_fetch_row () 20.4.19 mysql_field_count () 20.4.20 mysql_field_seek () 20.4.21 mysql_field_tell () 20.4.22 mysql_free_result () 20.4.23 mysql_get_client_info () 20.4.24 mysql_get_host_info () 20.4.25 mysql_get_proto_info () 20.4.26 mysql_get_server_info () 20.4.27 mysql_info () 20.4.28 mysql_init () 20.4.29 mysql_insert_id () 20.4.30 mysql_kill () 20.4.31 mysql_list_dbs () 20.4.32 mysql_list_fields () 20.4.33 mysql_list_processes () 20.4.34 mysql_list_tables () 20.4.35 mysql_num_fields () 20.4.36 mysql_num_rows () 20.4.37 mysql_options () 20.4.38 mysql_ping () 20.4.39 mysql_query () 20.4.40 mysql_real_connect () 20.4.41 mysql_real_query () 20.4.42 mysql_reload () 20.4.43 mysql_row_seek () 20.4.44 mysql_row_tell () 20.4.45 mysql_select_db () 20.4.46 mysql_shutdown () 20.4.47 mysql_stat () 20.4.48 mysql_store_result () 20.4.49 mysql_thread_id () 20.4.50 mysql_use_result () 20.4.51 为什么在mysql_query()返回成功后mysql_store_result()有时返回NULL? 20.4.52 我能从查询得到什么结果? 20.4.53 我怎样才能获得最后插入的行的唯一ID? 20.4.54 链接 C API的问题 20.4.55 怎样制作一个线程安全(thread-safe)的客户 20.5 MySQL Perl API20.5.1 DBI与DBD::mysql 20.5.2 DBI接口 20.5.3 更多的DBI/DBD信息 20.6 MySQL Eiffel 包装 20.7 MySQL Java 连接(JDBC) 20.8 MySQL PHP API 20.9 MySQL C++ API 20.10 MySQL Python API 20.11 MySQL TCL API 21 怎样对比MySQL与其他数据库21.1 怎样对比MySQL和mSQL 21.1.1 怎样将mSQL工具转换到MySQL 21.1.2 mSQL和MySQL的 客户机/服务器通讯协议有何不同 21.1.3 mSQL 2.0 SQL句法与MySQL有何不同 21.2 怎样对比MySQL与PostgreSQL A 一些 MySQL 用户 B 贡献的程序 C MySQL贡献者 D MySQL 变迁的历史记录 E MySQL已知的错误和设计缺限 F 我们想要在未来加入到MySQL 的计划表( TODO ) G 对移植到其他系统的说明 H MySQL 正则表达式句法的描述 I 什么是 Unireg? J 针对非微软操作系统的 MySQL 服务器许可证 K 针对微软操作系统的 MySQL 许可证 SQL命令,类型和函数索引 概念索引
05-31
1 MySQL的一般的信息 1.1 什么是MySQL? 1.2 关于本手册 1.2.1 本手册使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5 MySQL稳定性? 1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 2 MySQL 邮件列表及如何提问或报告错误 2.1 MySQL邮件列表 2.2 提问或报告错误 2.3 怎样报告错误或问题 2.4 在邮件列表上回答问题的指南 3 MySQL的许可证和技术支持 3.1 MySQL的许可证政策 3.2 MySQL 使用的版权 3.2.1 可能的未来版权改变 3.3 MySQL商业性分发 3.4 许可证实例 3.4.1 销售使用 MySQL的产品 3.4.2 销售MySQL相关的服务 3.4.3 ISP MySQL服务 3.4.4 运营一个使用MySQL的Web服务器 3.5 MySQL的许可证和技术支持费用 3.5.1 付款信息 3.5.2 联系信息 3.6 商业性支持的类型 3.6.1 基本的电子邮件支持 3.6.2 扩展的电子邮件支持 3.6.3 登录支持 3.6.4 扩展的登录支持 4 安装 MySQL 4.1 怎样获得MySQL 4.2 MySQL支持的操作系统 4.3 使用MySQL哪个版本 4.4 怎样和何时发布更新版本 4.5 安装布局 4.6 安装MySQL二进制代码分发 4.6.1 Linux RPM注意事项 4.6.2 构造客户程序 4.6.3 系统特定的问题 4.6.3.1 Linux 注意事项 4.6.3.2 HP-UX 注意事项 4.7 安装 MySQL源代码分发 4.7.1 快速安装概述 4.7.2 运用补丁 4.7.3 典型的configure选项 4.8 编译问题? 4.9 MIT-pthreads 注意事项 4.10 Perl 安装说明 4.10.1 在Unix操作系统上安装 Perl 4.10.2 在 Win32上安装 ActiveState Perl 4.10.3 在 Win32 上安装 MySQL Perl 分发 4.10.4 使用 Perl DBI/DBD接口遇到的问题 4.11 系统特定的问题 4.11.1 Solaris注意事项 4.11.2 Solaris 2.7 注意事项 4.11.3 Solaris x86 注意事项 4.11.4 SunOS 4 注意事项 4.11.5 Linux (所有的Linux版本)注意事项 4.11.5.1 Linux-x86 注意事项 4.11.5.2 RedHat 5.0 注意事项 4.11.5.3 RedHat 5.1 注意事项 4.11.5.4 Linux-SPARC 注意事项 4.11.5.5 Linux-Alpha 注意事项 4.11.5.6 MkLinux 注意事项 4.11.5.7 Qube2 Linux 注意事项 4.11.6 Alpha-DEC-Unix 注意事项 4.11.7 Alpha-DEC-OSF1 注意事项 4.11.8 SGI-Irix 注意事项 4.11.9 FreeBSD 注意事项 4.11.10 NetBSD 注意事项 4.11.11 BSD/OS 注意事项 4.11.11.1 BSD/OS 2.x 注意事项 4.11.11.2 BSD/OS 3.x 注意事项 4.11.11.3 BSD/OS 4.x 注意事项 4.11.12 SCO 注意事项 4.11.13 SCO Unixware 7.0 注意事项 4.11.14 IBM-AIX 注意事项 4.11.15 HP-UX 注意事项 4.12 Win32 注意事项 4.12.1 在 Win32 上安装 MySQL 4.12.2 在 Win95 /Win98上启动 MySQL 4.12.3 在 NT 上启动 MySQL 4.12.4 在 Win32 上运行 MySQL 4.12.5 用 SSH 从 Win32 连接一个远程MySQL 4.12.6 MySQL-Win32与Unix MySQL 比较 4.13 OS/2 注意事项 4.14 TcX 二进制代码 4.15 安装后期(post-installation)的设置与测试 4.15.1 运行mysql_install_db 的问题 4.15.2 启动 MySQL 服务器的问题 4.15.3 自动启动和停止 MySQL 4.15.4 选项文件 4.16 升级和降级(downgrading)时有什么特别要做的事情吗? 4.16.1 从一个 3.22 版本升级到 3.23 4.16.2 从一个 3.21 版本升级到 3.22 4.16.3 从一个 3.20 版本升级到 3.21 4.16.4 升级到其他的体系结构 5 MySQL 与标准的兼容性? 5.1 MySQL对ANSI SQL92 的扩充 5.2 以ANSI模式运行 MySQL 5.3 MySQL相比ANSI SQL92的差别 5.4 MySQL 缺乏的功能 5.4.1 子选择(Sub-selects) 5.4.2 SELECT INTO TABLE 5.4.3 事务(Transactions) 5.4.4 存储过程和触发器 5.4.5 外键(Foreign Keys) 5.4.5.1 不使用外键的理由 5.4.6 视图(Views) 5.4.7 '--'作为一个 注解的开始 5.5 MySQL 遵循什么标准? 5.6 怎样处理没有提交/回卷(COMMIT / ROLLBACK) 6 MySQL 存取权限系统 6.1 权限系统做什么 6.2 MySQL用户名和口令 6.3 与MySQL服务器连接 6.4 使你的口令安全 6.5 MySQL 提供的权限 6.6 权限系统工作原理 6.7 存取控制,阶段1:连接证实 6.8 存取控制,阶段2:请求证实 6.9 权限更改何时生效 6.10 建立初始的 MySQL权限 6.11 向MySQL增加新用户权限 6.12 怎样设置口令 6.13 存取拒绝(Access Denied)错误的原因 6.14 怎样使MySQL安全以对抗解密高手(cracker) 7 MySQL 语言参考 7.1 文字:怎样写字符串和数字 7.1.1 字符串 7.1.2 数字 7.1.3 十六进制值 7.1.4 NULL值 7.1.5 数据库,表,索引,列和别名的命名 7.1.5.1 名字的大小写敏感性 7.2 用户变量 7.3 列类型 7.3.1 列类型的存储要求 7.3.5 数字类型 7.3.6 日期和时间类型 7.3.6.1 问题和日期类型 7.3.6.2 DATETIME,DATE和TIMESTAMP类型 7.3.6.3 TIME类型 7.3.6.4 YEAR类型 7.3.7 字符串类型 7.3.7.1 CHAR和VARCHAR类型 7.3.7.2 BLOB和TEXT类型 7.3.7.3 ENUM类型 7.3.7.4 SET类型 7.3.8 为列选择正确的类型 7.3.9 列索引 7.3.10 多列索引 7.3.11 使用来自其他数据库引擎的列类型 7.4 用在SELECT和WHERE子句的函数 7.4.1 分组函数 7.4.2 常用的算术运算 7.4.3 位函数 7.4.4 逻辑运算 7.4.5 比较运算符 7.4.6 字符串比较函数 7.4.7 类型转换运算符 7.4.8 控制流函数 7.4.9 数学函数 7.4.10 字符串函数 7.4.11 日期和时间函数 7.4.12 其他函数 7.4.13 与GROUP BY子句一起使用的函数 7.5 CREATE DATABASE (创建数据库)句法 7.6 DROP DATABASE (抛弃数据库)句法 7.7 CREATE TABLE (创建表)句法 7.7.1 隐含(silent)的列指定变化 7.8 ALTER TABLE (改变表)句法 7.9 OPTIMIZE TABLE (优化表) 句法 7.10 DROP TABLE (抛弃表)句法 7.11 DELETE (删除)句法 7.12 SELECT (精选)句法 7.13 JOIN (联接)句法 7.14 INSERT (插入)句法 7.15 REPLACE (替换)句法 7.16 LOAD DATA INFILE (装载数据到文件)句法 7.17 UPDATE (更新)句法 7.18 USE (使用)句法 7.19 FLUSH (清除缓存)句法 7.20 KILL (杀灭)句法 7.21 SHOW (显示)句法(得到关于表,列等的信息) 7.22 EXPLAIN (解释)句法(得到关于SELECT的信息) 7.23 DESCRIBE (描述)句法(得到列的信息) 7.24 LOCK TABLES/UNLOCK TABLES (锁定表/解锁表)句法 7.25 SET OPTION (设置选项)句法 7.26 GRANT (授权)和REVOKE (撤回)句法 7.27 CREATE INDEX (创建索引)句法 7.28 DROP INDEX (抛弃索引)句法 7.29 注释句法 7.30 CREATE FUNCTION/DROP FUNCTION (创建函数/抛弃函数)句法 7.31 MySQL对保留字很挑剔吗? 8 MySQL 教程 8.1 联接和断开服务器 8.2 输入查询 8.3 常用查询的例子 8.3.1 列的最大值 8.3.2 拥有某个列的最大值的行 8.3.3 列的最大值:按组:只有值 8.3.4 拥有某个字段的组间最大值的行 8.3.5 使用外键 8.4 创建并使用一个数据库 8.4.1 创建并选用一个数据库 8.4.2 创建一个数据库表 8.4.3 将数据装入数据库表 8.4.4 从一个数据库表检索信息 8.4.4.1 选择所有数据 8.4.4.2 选择特定行 8.4.4.3 选择特定列 8.4.4.4 排序行 8.4.4.5 日期计算 8.4.4.6 NULL值操作 8.4.4.7 模式匹配 8.4.4.8 行计数 8.4.5 使用多个数据库表 8.5 获得数据库和表的信息 8.6 以批处理模式使用mysql 8.7 从"双胞项目"查询 8.7.1 找出所有非独处的双胞胎 8.7.2 显示关于双胞胎近况的表 9 MySQL 服务器功能 9.1 MySQL 支持哪些语言? 9.1.1 用于数据和排序的字符集 9.1.2 增加一个新的字符集 9.1.3 多字节字符支持 9.2 更新日志 9.3 MySQL数据库表可以有多大? 9.4 MySQL数据库表类型 10 从 MySQL 得到最大的性能 10.1 优化概述 10.2 系统/编译时和启动参数的调节 10.2.1 编译和链接如何影响 MySQL 的速度 10.2.2 磁盘问题 10.2.2.1 为数据库和表格使用符号链接 10.2.3 调节服务器参数 10.2.4 MySQL 怎样打开和关闭数据库表 10.2.5 在同一个数据库创建大量数据库表的缺点 10.2.6 为什么有这么多打开的表? 10.2.7 MySQL 怎样使用内存 10.2.8 MySQL 怎样锁定数据库表 10.2.9 数据库表级锁定的问题 10.3 使你的数据尽可能小 10.4 MySQL 索引的使用 10.5 存取或更新数据的查询速度 10.5.1 估计查询性能 10.5.2 SELECT 查询的速度 10.5.3 MySQL 怎样优化WHERE子句 10.5.4 MySQL 怎样优化LEFT JOIN 10.5.5 MySQL 怎样优化LIMIT 10.5.6 INSERT查询的速度 10.5.7 UPDATE查询的速度 10.5.8 DELETE查询的速度 10.6 选择一种表类型 10.6.1 静态(定长)表的特点 10.6.2 动态表的特点 10.6.3 压缩表的特点 10.6.4 内存(In-memory table)表的特点 10.7 其他优化技巧 10.8 使用你自己的基准测试 10.9 设计选择 10.10 MySQL 设计局限/折衷 10.11 可移植性 10.12 我们已将MySQL用在何处? 11 MySQL 基准套件 12 MySQL 实用程序 12.1 各种 MySQL 程序概述 12.2 管理一个 MySQL 服务器 12.3 从 MySQL 数据库和表倒出(dump)结构和数据 12.4 从文本文件导入数据 12.5 MySQL 压缩只读表生成器 13 维护 MySQL 安装 13.1 使用myisamchk进行表维护和崩溃恢复 13.1.1 myisamchk的调用语法 13.1.2 myisamchk的内存使用 13.2 13.2 建立一个数据库表维护规范 13.3 获得关于一个表的信息 13.4 使用myisamchk进行崩溃恢复 13.4.1 怎样检查表的出错 13.4.2 怎样修复表 13.4.3 表优化 13.5 日志文件维护 14 为MySQL增加新函数 14.1 增加一个新的用户定义函数 14.1.1 UDF调用顺序 14.1.2 参数处理 14.1.3 返回值和出错处理 14.1.4 编译并安装用户定义函数 14.2 增加一个新的原生(native)函数 15 为MySQL增加新过程 15.1 analyse过程 15.2 编写一个过程 16 MySQL对 ODBC 支持 16.1 MyODBC 支持的操作系统 16.2 怎样报告 MyODBC的问题 16.3 已知可用 MyODBC一起工作的程序 16.4 怎样填写 ODBC 管理程序的各种域 16.5 怎样在ODBC获得一个AUTO_INCREMENT列的值 16.6 报告 MyODBC 的问题 17 与一些常用程序一起使用MySQL 17.1 与 Apache一起使用 MySQL 18 问题和常见的错误 18.1 如果 MySQL总是崩溃怎么办 18.2 使用 MySQL 时一些常见错误 18.2.1 MySQL server has gone away错误 18.2.2 Can't connect to [local] MySQL server错误 18.2.3 Host '...' is blocked错误 18.2.4 Out of memory错误 18.2.5 Packet too large错误 18.2.6 The table is full错误 18.2.7 Commands out of sync in client错误 18.2.8 Ignoring user错误 18.2.9 Table 'xxx' doesn't exist错误 18.3 MySQL 怎样处理一个溢出的磁盘 18.4 怎样从一个文本文件运行SQL命令 18.5 MySQL 在哪儿存储临时文件 18.6 怎样保护"/tmp/mysql.sock"不被删除 18.7 Access denied 出错 18.8 怎样作为一个一般用户运行 MySQL 18.9 怎样重新设置一个忘记的口令 18.10 文件许可权限问题 18.11 文件没找到 18.12 使用DATE列的问题 18.13 时区问题 18.14 在搜索的大小写敏感性 18.15 NULL值问题 18.16 alias问题 18.17 从相关的表删除行 18.18 解决没有匹配行的问题 18.19 ALTER TABLE问题 18.20 怎样改变一个表列的次序 19 解决MySQL 一些常见的问题 19.1 数据库复制 19.2 数据库备份 19.3 在同一台机器上运行多个 MySQL 服务器 20 MySQL 客户工具和 API 20.1 MySQL C API 20.2 C API数据类型 20.3 C API函数概述 20.4 C API函数描述 20.4.1 mysql_affected_rows () 20.4.2 mysql_close () 20.4.3 mysql_connect () 20.4.4 mysql_change_user () 20.4.5 mysql_create_db () 20.4.6 mysql_data_seek () 20.4.7 mysql_debug () 20.4.8 mysql_drop_db () 20.4.9 mysql_dump_debug_info () 20.4.10 mysql_eof () 20.4.11 mysql_errno () 20.4.12 mysql_error () 20.4.13 mysql_escape_string () 20.4.14 mysql_fetch_field () 20.4.15 mysql_fetch_fields () 20.4.16 mysql_fetch_field_direct () 20.4.17 mysql_fetch_lengths () 20.4.18 mysql_fetch_row () 20.4.19 mysql_field_count () 20.4.20 mysql_field_seek () 20.4.21 mysql_field_tell () 20.4.22 mysql_free_result () 20.4.23 mysql_get_client_info () 20.4.24 mysql_get_host_info () 20.4.25 mysql_get_proto_info () 20.4.26 mysql_get_server_info () 20.4.27 mysql_info () 20.4.28 mysql_init () 20.4.29 mysql_insert_id () 20.4.30 mysql_kill () 20.4.31 mysql_list_dbs () 20.4.32 mysql_list_fields () 20.4.33 mysql_list_processes () 20.4.34 mysql_list_tables () 20.4.35 mysql_num_fields () 20.4.36 mysql_num_rows () 20.4.37 mysql_options () 20.4.38 mysql_ping () 20.4.39 mysql_query () 20.4.40 mysql_real_connect () 20.4.41 mysql_real_query () 20.4.42 mysql_reload () 20.4.43 mysql_row_seek () 20.4.44 mysql_row_tell () 20.4.45 mysql_select_db () 20.4.46 mysql_shutdown () 20.4.47 mysql_stat () 20.4.48 mysql_store_result () 20.4.49 mysql_thread_id () 20.4.50 mysql_use_result () 20.4.51 为什么在mysql_query()返回成功后mysql_store_result()有时返回NULL? 20.4.52 我能从查询得到什么结果? 20.4.53 我怎样才能获得最后插入的行的唯一ID? 20.4.54 链接 C API的问题 20.4.55 怎样制作一个线程安全(thread-safe)的客户 20.5 MySQL Perl API 20.5.1 DBI与DBD::mysql 20.5.2 DBI接口 20.5.3 更多的DBI/DBD信息 20.6 MySQL Eiffel 包装 20.7 MySQL Java 连接(JDBC) 20.8 MySQL PHP API 20.9 MySQL C API 20.10 MySQL Python API 20.11 MySQL TCL API 21 怎样对比MySQL与其他数据库 21.1 怎样对比MySQL和mSQL 21.1.1 怎样将mSQL工具转换到MySQL 21.1.2 mSQL和MySQL的 客户机/服务器通讯协议有何不同 21.1.3 mSQL 2.0 SQL句法与MySQL有何不同 21.2 怎样对比MySQL与PostgreSQL
Ø 常用查询 MySQL结束符是“;”结束。 1、 显示所有数据库 show databases; 2、 删除数据库 drop database dbName; 3、 创建数据库 create database [if not exists] dbName; 括号部分可选的,判断该数据不存在就创建 4、 切换、使用指定数据库 use dbName; 5、 显示当前使用数据库所有的表对象 show tables; 6、 显示表结构describe(desc) desc tableName; 7、 创建一张表 create table user ( --int 整型 uId int, --小数 uPrice decimal, --普通长度文本,default设置默认值 uName varchar(255) default ‘zhangsan’, --超长文本 uRemark text, --图片 uPhoto blob, --日期 uBirthday datetime ); 8、 子查询建表方法 部分列名匹配模式: create table userInfo ( name varchar(20), sex char ) as select name, sex from user; 上面的列名和子查询的列名以及类型要对应 全部列名模式: create table userInfo as select * from user; 直接将整个表的类型和数据备份到新表userInfo 9、 添加表字段 添加单列 alter table user add tel varchar(11) default ‘02012345678’; 添加多列 alter table user add ( photo blob, birthday date ); 上面就同时增加了多列字段 10、 修改表字段 修改tel列 alter table user modify tel varchar(15) default ‘02087654321’; 修改tel列的位置,在第一列显示 alter table user modify tel varchar(15) default '02087654321' first; 修改tel列的位置,在指定列之后显示 alter table user modify tel varchar(15) default '02087654321' after age; 注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改 但是MySQL可以通过多个modify的方式完成: alter table user modify tel varchar(15) default '02087654321' first, modify name varchar(20) after tel; 11、 删除指定字段 alter table user drop photo; 12、 重命名表数据 表重命名 alter table user rename to users; 字段重命名 alter table users change name u_name varchar(10); alter table users change sex u_sex varchar(10) after u_name; 如果需要改变列名建议使用change,如果需要改变数据类型和显示位置可以使用modify 13、 删除表 drop table users; drop删除表会删除表结构,表对象将不存在数据;数据也不会存在;表内的对象也不存在,如:索引、视图、约束; truncate删除表 truncate都被当成DDL出来,truncate的作用就是删除该表里的全部数据,保留表结构。相当于DDLdelete语句, 但是truncate比delete语句的速度要快得多。但是truncate不能带条件删除指定数据,只会删除所有的数据。如果删除的表有外键, 删除的速度类似于delete。但新版本的MySQLtruncate的速度比delete速度快。 Ø 约束 MySQL约束保存在information_schema数据库的table_constraints,可以通过该表查询约束信息; 约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 常用五类约束: not null:非空约束,指定某列不为空 unique: 唯一约束,指定某列和几列组合的数据不能重复 primary key:主键约束,指定某列的数据不能重复、唯一 foreign key:外键,指定该列记录属于主表的一条记录,参照另一条数据 check:检查,指定一个表达式,用于检验指定数据 MySQL不支持check约束,但可以使用check约束,而没有任何效果; 根据约束数据列限制,约束可分为: 单列约束:每个约束只约束一列 多列约束:每个约束约束多列数据 MySQL约束保存在information_schema数据库的table_constraints,可以通过该表查询约束信息; 1、 not null约束 非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。 Null类型特征: 所有的类型的值都可以是null,包括int、float等数据类型 空字符串“”是不等于null,0也不等于null create table temp( id int not null, name varchar(255) not null default ‘abc’, sex char null ) 上面的table加上了非空约束,也可以用alter来修改或增加非空约束 增加非空约束 alter table temp modify sex varchar(2) not null; 取消非空约束 alter table temp modify sex varchar(2) null; 取消非空约束,增加默认值 alter table temp modify sex varchar(2) default ‘abc’ null; 2、 unique 唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null 同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。 唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。 MySQL会给唯一约束的列上默认创建一个唯一索引; create table temp ( id int not null, name varchar(25), password varchar(16), --使用表级约束语法, constraint uk_name_pwd unique(name, password) ); 表示用户名和密码组合不能重复 添加唯一约束 alter table temp add unique(name, password); alter table temp modify name varchar(25) unique; 删除约束 alter table temp drop index name; 3、 primary key 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复。 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。MySQL的主键名总是PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。 列模式: create table temp( /*主键约束*/ id int primary key, name varchar(25) ); create table temp2( id int not null, name varchar(25), pwd varchar(15), constraint pk_temp_id primary key(id) ); 组合模式: create table temp2( id int not null, name varchar(25), pwd varchar(15), constraint pk_temp_id primary key(name, pwd) ); alter删除主键约束 alter table temp drop primary key; alter添加主键 alter table temp add primary key(name, pwd); alter修改列为主键 alter table temp modify id int primary key; 设置主键自增 create table temp( id int auto_increment primary key, name varchar(20), pwd varchar(16) ); auto_increment自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。 4、 foreign key 约束 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表能找到或者为空。 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表依赖该记录的数据, 然后才可以删除主表的数据。还有一种就是级联删除子表数据。 注意:外键约束的参照列,在主表引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录, 那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。 创建外键约束: 主表 create table classes( id int auto_increment primary key, name varchar(20) ); 从表 create table student( id int auto_increment, name varchar(22), constraint pk_id primary key(id), classes_id int references classes(id) ); 通常先建主表,然后再建从表,这样从表的参照引用的表才存在。 表级别创建外键约束: create table student( id int auto_increment primary key, name varchar(25), classes_id int, foreign key(classes_id) references classes(id) ); 上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n, 其student是表名,n是当前约束从1开始的整数。 指定约束名称: create table student( id int auto_increment primary key, name varchar(25), classes_id int, /*指定约束名称*/ constraint fk_classes_id foreign key(classes_id) references classes(id) ); 多列外键组合,必须用表级别约束语法: create table classes( id int, name varchar(20), number int, primary key(name, number) ); create table student( id int auto_increment primary key, name varchar(20), classes_name varchar(20), classes_number int, /*表级别联合外键*/ foreign key(classes_name, classes_number) references classes(name, number) ); 删除外键约束: alter table student drop foreign key student_ibfk_1; alter table student drop foreign key fk_student_id; 增加外键约束 alter table student add foreign key(classes_name, classes_number) referencesclasses(name, number); 自引用、自关联(递归表、树状表) create table tree( id int auto_increment primary key, name varchar(50), parent_id int, foreign key(parent_id) references tree(id) ); 级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加on deletecascade 或on delete set null,前者是级联删除,后者是将从表的关联列的值设置为null。 create table student( id int auto_increment primary key, name varchar(20), classes_name varchar(20), classes_number int, /*表级别联合外键*/ foreign key(classes_name, classes_number) references classes(name, number) on deletecascade ); 5、 check约束 MySQL可以使用check约束,但check约束对数据验证没有任何作用。 create table temp( id int auto_increment, name varchar(20), age int, primary key(id), /*check约束*/ check(age > 20) ); 上面check约束要求age必须大于0,但没有任何作用。但是创建table的时候没有任何错误或警告。 Ø 索引 索引是存放在模式(schema)的一个数据库对象,索引的作用就是提高对表的检索查询速度, 索引是通过快速访问的方法来进行快速定位数据,从而减少了对磁盘的读写操作。 索引是数据库的一个对象,它不能独立存在,必须对某个表对象进行依赖。 提示:索引保存在information_schema数据库里的STATISTICS表。 创建索引方式: 自动:当表上定义主键约束、唯一、外键约束时,该表会被系统自动添加上索引。 手动:手动在相关表或列上增加索引,提高查询速度。 删除索引方式: 自动:当表对象被删除时,该表上的索引自动被删除 手动:手动删除指定表对象的相关列上的索引 索引类似于书籍的目录,可以快速定位到相关的数据,一个表可以有多个索引。 创建索引: create index idx_temp_name on temp(name); 组合索引: create index idx_temp_name$pwd on temp(name, pwd); 删除索引: drop index idx_temp_name on temp; Ø 视图 视图就是一个表或多个表的查询结果,它是一张虚拟的表,因为它并不能存储数据。 视图的作用、优点: 限制对数据的访问 让复杂查询变得简单 提供数据的独立性 可以完成对相同数据的不同显示 创建、修改视图 create or replace view view_temp as select name, age from temp; 通常我们并不对视图的数据做修改操作,因为视图是一张虚拟的表,它并不存储实际数据。如果想让视图不被修改,可以用with check option来完成限制。 create or replace view view_temp as select * from temp with check option; 修改视图: alter view view_temp as select id, name from temp; 删除视图: drop view view_temp; 显示创建语法: show create view v_temp; Ø DML语句 DML主要针对数据库表对象的数据而言的,一般DML完成: 插入新数据 修改已添加的数据 删除不需要的数据 1、 insert into 插入语句 insert into temp values(null, ‘jack’, 25); 主键自增可以不插入,所以用null代替 指定列 insert into temp(name, age) values(‘jack’, 22); 在表面后面带括号,括号写列名,values写指定列名的值即可。当省略列名就表示插入全部数据, 注意插入值的顺序和列的顺序需要保持一致。 Set方式插入,也可以指定列 insert into temp set id = 7, name = 'jason'; MySQL外键的table的外键引用列可以插入数据可以为null,不参照主表的数据。 使用子查询插入数据 insert into temp(name) select name from classes; 多行插入 insert into temp values(null, ‘jack’, 22), (null, ‘jackson’ 23); 2、 update 修改语句 update主要完成对数据的修改操作,可以修改一条或多条数据。修改多条或指定条件的数据,需要用where条件来完成。 修改所有数据 update temp set name = ‘jack2’; 所有的数据的name会被修改,如果修改多列用“,”分开 update temp set name = ‘jack’, age = 22; 修改指定条件的记录需要用where update temp set name = ‘jack’ where age > 22; 3、 delete 删除语句 删除table的数据,可以删除所有,带条件可以删除指定的记录。 删除所有数据 delete from temp; 删除指定条件数据 delete from temp where age > 20; Ø select 查询、function 函数 select查询语句用得最广泛、功能也最丰富。可以完成单条记录、多条记录、单表、多表、子查询等。 1、 查询某张表所有数据 select * from temp; *代表所有列,temp代表表名,不带条件就查询所有数据 2、 查询指定列和条件的数据 select name, age from temp where age = 22; 查询name和age这两列,age 等于22的数据。 3、 对查询的数据进行运算操作 select age + 2, age / 2, age – 2, age * 2 from temp where age – 2 > 22; 4、 concat函数,字符串连接 select concat(name, ‘-eco’) from temp; concat和null进行连接,会导致连接后的数据成为null 5、 as 对列重命名 select name as ‘名称’ from temp; as也可以省略不写,效果一样 如果重命名的列名出现特殊字符,如“‘”单引号,那就需要用双引号引在外面 select name as “名’称” from temp; 6、 也可以给table去别名 select t.name Name from temp as t; 7、 查询常量 类似于SQL Server select 5 + 2; select concat('a', 'bbb'); 8、 distinct 去掉重复数据 select distinct id from temp; 多列将是组合的重复数据 select distinct id, age from temp; 9、 where 条件查询 大于>、大于等于>=、小于<、小于等于<=、等于=、不等于<> 都可以出现在where语句 select * from t where a > 2 or a >= 3 or a < 5 or a <= 6 or a = 7 or a <> 0; 10、 and 并且 select * from temp where age > 20 and name = ‘jack’; 查询名称等于jack并且年龄大于20的 11、 or 或者 满足一个即可 select * from tmep where name = ‘jack’ or name = ‘jackson’; 12、 between v and v2 大于等于v且小于等于v2 select * form temp where age between 20 and 25; 13、 in 查询 可以多个条件 类似于or select * from temp where id in (1, 2, 3); 查询id在括号出现的数据 14、 like 模糊查询 查询name以j开头的 select * from temp where name like ‘j%’; 查询name包含k的 select * from temp where name like ‘%k%’; escape转义 select * from temp where name like ‘/_%’ escape ‘/’; 指定/为转义字符,上面的就可以查询name包含“_”的数据 15、 is null、is not null 查询为null的数据 select * from temp where name is null; 查询不为null的数据 select * from temp where name is not null; 16、 not select * from temp where not (age > 20); 取小于等于20的数据 select * from temp where id not in(1, 2); 17、 order by 排序,有desc、asc升序、降序 select * from temp order by id; 默认desc排序 select * from temp order by id asc; 多列组合 select * from temp order by id, age; Ø function 函数 函数的作用比较大,一般多用在select查询语句和where条件语句之后。按照函数返回的结果, 可以分为:多行函数和单行函数;所谓的单行函数就是将每条数据进行独立的计算,然后每条数据得到一条结果。 如:字符串函数;而多行函数,就是多条记录同时计算,得到最终只有一条结果记录。如:sum、avg等 多行函数也称为聚集函数、分组函数,主要用于完成一些统计功能。MySQL的单行函数有如下特征: 单行函数的参数可以是变量、常量或数据列。单行函数可以接受多个参数,但返回一个值。 单行函数就是它会对每一行单独起作用,每一行(可能包含多个参数)返回一个结果。 单行函数可以改变参数的数据类型。单行函数支持嵌套使用:内层函数的返回值是外层函数的参数。 单行函数可以分为: 类型转换函数; 位函数; 流程控制语句; 加密解密函数; 信息函数 单行函数 1、 char_length字符长度 select char_length(tel) from user; 2、 sin函数 select sin(age) from user; select sin(1.57); 3、 添加日期函数 select date_add('2010-06-21', interval 2 month); interval是一个关键字,2 month是2个月的意思,2是数值,month是单位 select addDate('2011-05-28', 2); 在前面的日期上加上后面的天数 4、 获取当前系统时间、日期 select curdate(); select curtime(); 5、 加密函数 select md5('zhangsan'); 6、 Null 处理函数 select ifnull(birthday, 'is null birthday') from user; 如果birthday为null,就返回后面的字符串 select nullif(age, 245) from user; 如果age等于245就返回null,不等就返回age select isnull(birthday) from user; 判断birthday是否为null select if(isnull(birthday), 'birthday is null', 'birthday not is null') from user; 如果birthday为null或是0就返回birthday is null,否则就返回birthday not is null;类似于三目运算符 7、 case 流程函数 case函数是一个流程控制函数,可以接受多个参数,但最终只会返回一个结果。 select name, age, (case sex when 1 then '男' when 0 then '女' else '火星人' end ) sex from user; 组函数 组函数就是多行函数,组函数是完成一行或多行结果集的运算,最后返回一个结果,而不是每条记录返回一个结果。 1、 avg平均值运算 select avg(age) from user; select avg(distinct age) from user; 2、 count 记录条数统计 select count(*), count(age), count(distinct age) from user; 3、 max 最大值 select max(age), max(distinct age) from user; 4、 min 最小值 select min(age), min(distinct age) from user; 5、 sum 求和、聚和 select sum(age), sum(distinct age) from user; select sum(ifnull(age, 0)) from user; 6、 group by 分组 select count(*), sex from user group by sex; select count(*) from user group by age; select * from user group by sex, age; 7、 having进行条件过滤 不能在where子句过滤组,where子句仅用于过滤行。过滤group by需要having 不能在where子句用组函数,having才能用组函数 select count(*) from user group by sex having sex <> 2; Ø 多表查询和子查询 数据库的查询功能最为丰富,很多时候需要用到查询完成一些事物,而且不是单纯的对一个表进行操作。而是对多个表进行联合查询, MySQL多表连接查询有两种规范,较早的SQL92规范支持,如下几种表连接查询: 等值连接 非等值连接 外连接 广义笛卡尔积 SQL99规则提供了可读性更好的多表连接语法,并提供了更多类型的连接查询,SQL99支持如下几种多表连接查询: 交叉连接 自然连接 使用using子句的连接 使用on子句连接 全部连接或者左右外连接 SQL92的连接查询 SQL92的连接查询语法比较简单,多将多个table放置在from关键字之后,多个table用“,”隔开; 连接的条件放在where条件之后,与查询条件直接用and逻辑运算符进行连接。如果条件使用的是相等, 则称为等值连接,相反则称为非等值,如果没有任何条件则称为广义笛卡尔积。 广义笛卡尔积:select s.*, c.* from student s, classes c; 等值:select s.*, c.* from student s, classes c where s.cid = c.id; 非等值:select s.*, c.* from student s, classes c where s.cid <> c.id; select s.*, c.name classes from classes c, student s where c.id = s.classes_id ands.name is not null; SQL99连接查询 1、交叉连接cross join,类似于SQL92的笛卡尔积查询,无需条件。如: select s.*, c.name from student s cross join classes c; 2、自然连接 natural join查询,无需条件,默认条件是将2个table的相同字段作为连接条件,如果没有相同字段,查询的结果就是空。 select s.*, c.name from student s natural join classes c; 3、using子句连接查询:using的子句可以是一列或多列,显示的指定两个表同名列作为连接条件。 如果用natural join的连接查询,会把所有的相同字段作为连接查询。而using可以指定相同列及个数。 select s.*, c.name from student s join classes c using(id); 4、 join … on连接查询,查询条件在on完成,每个on语句只能指定一个条件。 select s.*, c.name from student s join classes c on s.classes_id = c.id; 5、 左右外连接:3种外连接,left [outer] join、right [outer] join,连接条件都是通过用on子句来指定,条件可以等值、非等值。 select s.*, c.name from student s left join classes c on s.classes_id = c.id; select s.*, c.name from student s right join classes c on s.classes_id = c.id; 子查询 子查询就是指在查询语句嵌套另一个查询,子查询可以支持多层嵌套。子查询可以出现在2个位置: from关键字之后,被当做一个表来进行查询,这种用法被称为行内视图,因为该子查询的实质就是一个临时视图 出现在where条件之后作为过滤条件的值 子查询注意点: 子查询用括号括起来,特别情况下需要起一个临时名称 子查询当做临时表时(在from之后的子查询),可以为该子查询起别名,尤其是要作为前缀来限定数据列名时 子查询用作过滤条件时,将子查询放在比较运算符的右边,提供可读性 子查询作为过滤条件时,单行子查询使用单行运算符,多行子查询用多行运算符 将from后面的子查询当做一个table来用: select * from (select id, name from classes) s where s.id in (1, 2); 当做条件来用: select * from student s where s.classes_id in (select id from classes); select * from student s where s.classes_id = any (select id from classes); select * from student s where s.classes_id > any (select id from classes); Ø 操作符和函数 1、 boolean只判断 select 1 is true, 0 is false, null is unknown; select 1 is not unknown, 0 is not unknown, null is not unknown; 2、 coalesce函数,返回第一个非null的值 select coalesce(null, 1); select coalesce(1, 1); select coalesce(null, 1); select coalesce(null, null); 3、 当有2个或多个参数时,返回最大的那个参数值 select greatest(2, 3); select greatest(2, 3, 1, 9, 55, 23); select greatest('D', 'A', 'B'); 4、 Least函数,返回最小值,如果有null就返回null值 select least(2, 0); select least(2, 0, null); select least(2, 10, 22.2, 35.1, 1.1); 5、 控制流函数 select case 1 when 1 then 'is 1' when 2 then 'is 2' else 'none' end; select case when 1 > 2 then 'yes' else 'no' end; 6、 ascii字符串函数 select ascii('A'); select ascii('1'); 7、 二进制函数 select bin(22); 8、 返回二进制字符串长度 select bit_length(11); 9、 char将值转换成字符,小数取整四舍五入 select char(65); select char(65.4); select char(65.5); select char(65.6); select char(65, 66, 67.4, 68.5, 69.6, '55.5', '97.3'); 10、 using改变字符集 select charset(char(0*65)), charset(char(0*65 using utf8)); 11、 得到字符长度char_length,character_length select char_length('abc'); select character_length('eft'); 12、 compress压缩字符串、uncompress解压缩 select compress('abcedf'); select uncompress(compress('abcedf')); 13、 concat_ws分隔字符串 select concat_ws('#', 'first', 'second', 'last'); select concat_ws('#', 'first', 'second', null, 'last'); Ø 事务处理 动作 开始事务:start transaction 提交事务:commit 回滚事务:rollback 设置自动提交:set autocommit 1 | 0 atuoCommit系统默认是1立即提交模式;如果要手动控制事务,需要设置set autoCommit 0; 这样我们就可以用commit、rollback来控制事务了。 在一段语句块禁用autocommit 而不是set autocommit start transaction; select @result := avg(age) from temp; update temp set age = @result where id = 2; select * from temp where id = 2;//值被改变 rollback;//回滚 select * from temp where id = 2;//变回来了 在此期间只有遇到commit、rollback,start Transaction的禁用autocommit才会结束。然后就恢复到原来的autocommit模式; 不能回滚的语句 有些语句不能被回滚。通常,这些语句包括数据定义语言(DDL)语句,比如创建或取消数据库的语句, 和创建、取消或更改表或存储的子程序的语句。 您在设计事务时,不应包含这类语句。如果您在事务的前部发布了一个不能被回滚的语句, 则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。 一些操作也会隐式的提交事务 如alter、create、drop、rename table、lock table、set autocommit、starttransaction、truncate table 等等, 在事务出现这些语句也会提交事务的 事务不能嵌套事务 事务的保存点 Savepoint pointName/Rollback to savepoint pointName 一个事务可以设置多个保存点,rollback可以回滚到指定的保存点,恢复保存点后面的操作。 如果有后面的保存点和前面的同名,则删除前面的保存点。 Release savepoint会删除一个保存点,如果在一段事务执行commit或rollback,则事务结束,所以保存点删除。 Set Transaction设计数据库隔离级别 SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } 本语句用于设置事务隔离等级,用于下一个事务,或者用于当前会话。 在默认情况下,SET TRANSACTION会为下一个事务(还未开始)设置隔离等级。 如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级, 用于从该点以后创建的所有新连接。原有的连接不受影响。使用SESSION关键测可以设置默认事务等级, 用于对当前连接执行的所有将来事务。 默认的等级是REPEATABLE READ全局隔离等级。 Ø 注释 select 1+1; # 单行注释 select 1+1; -- 单行注释 select 1 /* 多行注释 */ + 1; Ø 基本数据类型操作 字符串 select 'hello', '"hello"', '""hello""', 'hel''lo', '/'hello'; select "hello", "'hello'", "''hello''", "hel""lo", "/"hello"; /n换行 select 'This/nIs/nFour/nLines'; /转义 select 'hello / world!'; select 'hello /world!'; select 'hello // world!'; select 'hello /' world!'; Ø 设置数据库mode模式 SET sql_mode='ANSI_QUOTES'; create table t(a int); create table "tt"(a int); create table "t""t"(a int); craate talbe tab("a""b" int); Ø 用户变量 set @num1 = 0, @num2 = 2, @result = 0; select @result := (@num1 := 5) + @num2 := 3, @num1, @num2, @result; Ø 存储过程 创建存储过程: delimiter // create procedure get(out result int) begin select max(age) into result from temp; end// 调用存储过程: call get(@temp); 查询结果: select @temp; 删除存储过程: drop procedure get; 查看存储过程创建语句: show create procedure get; select…into 可以完成单行记录的赋值: create procedure getRecord(sid int) begin declare v_name varchar(20) default 'jason'; declare v_age int; declare v_sex bit; select name, age, sex into v_name, v_age, v_sex from temp where id = sid; select v_name, v_age, v_sex; end; call getRecord(1); Ø 函数 函数类似于存储过程,只是调用方式不同 例如:select max(age) from temp; 创建函数: create function addAge(age int) returns int return age + 5; 使用函数: select addAge(age) from temp; 删除函数: drop function if exists addAge; drop function addAge; 显示创建语法: show create function addAge; Ø 游标 声明游标:declare cur_Name cursor for select name from temp; 打开游标:open cur_Name; Fetch游标:fetch cur_Name into @temp; 关闭游标:close cur_Name; 示例: CREATE PROCEDURE cur_show() BEGIN DECLARE done INT DEFAULT 0; DECLARE v_id, v_age INT; DECLARE v_name varchar(20); DECLARE cur_temp CURSOR FOR SELECT id, name, age FROM temp; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cur_temp; REPEAT FETCH cur_temp INTO v_id, v_name, v_age; IF NOT done THEN IF isnull(v_name) THEN update temp set name = concat('test-json', v_id) where id = v_id; ELSEIF isnull(v_age) THEN update temp set age = 22 where id = v_id; END IF; END IF; UNTIL done END REPEAT; CLOSE cur_temp; END Ø 触发器 触发器分为insert、updatedelete三种触发器事件类型 还有after、before触发时间 创建触发器: create trigger trg_temp_ins before insert on temp for each row begin insert into temp_log values(NEW.id, NEW.name); end// 删除触发器: drop trigger trg_temp_ins
DB类<?php header('Content-Type:text/html; charset=utf-8'); basename($_SERVER['PHP_SELF'])=='mysql.inc.php'&&header; ('Location:http://'.$_SERVER['HTTP_HOST']); //禁止直接访问本页 /** ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ※※※※※※※※ 【文件名】: mysql.inc.php 【作 用】: mysql数据库操作类 【作 者】: Riyan 【版 本】: version 2.0 【修改日期】: 2010/02/11 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ※※※※※※※※ **/ class mysql{ private $host; // 数据库主机 private $user; // 数据库用户名 private $pass; // 数据库密码 private $data; // 数据库名 private $conn; // 数据库连接标识 private $sql; // sql语句 private $code; // 数据库编码,GBK,UTF8,GB2312 private $result; // 执行query命令的结果数据集 private $errLog=true; // 是否开启错误日志,默认开启 private $showErr=true; // 显示所有错误,具有安全隐患,默认开启 private $pageNo=1; // 当前页 private $pageAll=1; // 总页数 private $rsAll=0; // 总记录 private $pageSize=10; // 每页显示记录条数 /****************************************************************** -- 函数名:__construct($host,$user,$pass,$data,$code,$conn) -- 作 用:构造函数 -- 参 数:$host 数据库主机地址(必填) $user 数据库用户名(必填) $pass 数据库密码(必填) $data 数据库名(必填) $conn 数据库连接标识(必填) $code 数据库编码(必填) -- 返回值:无 -- 实 例:无 *******************************************************************/ public function __construct($host,$user,$pass,$data,$code='utf8', $conn='conn'){ $this->host=$host; $this->user=$user; $this->pass=$pass; $this->data=$data; $this->conn=$conn; $this->code=$code; $this->connect(); } public function __get($name){return $this->$name;} public function __set($name,$value){$this->$name=$value;} // 数据库连接 private function connect(){ if ($this->conn=='pconn') $this->conn=mysql_pconnect($this- >host,$this->user,$this->pass); // 永久链接 else $this->conn=mysql_connect($this->host,$this->user,$this- >pass); // 临时链接 if (!$this->conn) $this->show_error('无法连接服务器'); $this->select_db($this->data); $this->query('SET NAMES '.$this->code); $this->query("SET CHARACTER_SET_CLIENT='{$this->code}'"); $this->query("SET CHARACTER_SET_RESULTS='{$this->code}'"); } // 数据库选择 public function select_db($data){ $result=mysql_select_db($data,$this->conn); if (!$result) $this->show_error('无法连接数据库'.$data); return $result; } /****************************************************************** -- 函数名:get_info($num) -- 作 用:取得 MySQL 服务器信息 -- 参 数:$num 信息值(选填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function get_info($num){ switch ($num){ case 1: return mysql_get_server_info(); // 取得 MySQL 服务器信息 break; case 2: return mysql_get_host_info(); // 取得 MySQL 主机信息 break; case 3: return mysql_get_proto_info(); // 取得 MySQL 协议信息 break; default: return mysql_get_client_info(); // 取得 MySQL 客户端信息 } } /****************************************************************** -- 函数名:query($sql) -- 作 用:数据库执行语句,可执行查询添加修改删除等任何sql语句 -- 参 数:$sql sql语句(必填) -- 返回值:布尔 -- 实 例:无 *******************************************************************/ public function query($sql){ if (empty($sql)) $this->show_error('SQL语句为空'); $this->sql=preg_replace('/ {2,}/',' ',trim($sql)); $this->result=mysql_query($this->sql,$this->conn); if (!$this->result) $this->show_error('SQL语句有误',true); return $this->result; } /****************************************************************** -- 函数名:create_db($data) -- 作 用:创建添加新的数据库 -- 参 数:$data 数据库名称(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function create_database($data=''){$this->query("CREATE DATABASE {$data}");} // 查询服务器所有数据库 public function show_database(){ $this->query('SHOW DATABASES'); $db=array(); while ($row=$this->fetch_array()) $db[]=$row['Database']; return $db; } // 查询数据库下所有的表 public function show_tables($data=''){ if (!empty($data)) $db=' FROM '.$data; $this->query('SHOW TABLES'.$data); $tables=array(); while ($row=$this->fetch_row()) $tables[]=$row[0]; return $tables; } /****************************************************************** -- 函数名:copy_tables($tb1,$tb2,$where) -- 作 用:复制表 -- 参 数:$tb1 新表名(必填) $tb2 待复制表的表名(必填) $Condition 复制条件(选填) -- 返回值:布尔 -- 实 例:无 *******************************************************************/ public function copy_tables($tb1,$tb2,$Condition=''){$this->query ("SELECT * INTO `{$tb1}` FROM `{$tb2}` {$Condition}");} /****************************************************************** -- 函数名:Get($Table,$Fileds,$Condition,$Rows) -- 作 用:查询数据 -- 参 数:$Table 表名(必填) $Fileds 字段名,默认为所有(选填) $Condition 查询条件(选填) $Rows 待查询记录条数,为0表示不限制(选填) -- 返回值:布尔 -- 实 例:$DB->Get('mydb','user,password','order by id desc',10) *******************************************************************/ public function Get($Table,$Fileds='*',$Condition='',$Rows=0){ if (!$Fileds) $Fileds='*'; if ($Rows>0) $Condition.=" LIMIT 0,{$Rows}"; $sql="SELECT {$Fileds} FROM `{$Table}` {$Condition}"; return $this->query($sql); } // 只查询一条记录 public function GetRs($Table,$Fileds='*',$Condition=''){ if (!$Fileds) $Fileds='*'; $this->query("SELECT {$Fileds} FROM `{$Table}` {$Condition} LIMIT 0,1"); return $this->fetch_array(); } /****************************************************************** -- 函数名:Add($Table,$Data) -- 作 用:添加数据 -- 参 数:$Table 表名(必填) $Data 待添加数据,可以为数组(必填) -- 返回值:布尔 -- 实 例:$DB->Add('mydb',array ('user'=>'admin','password'=>'123456','age'=>'18') 数组类型 $DB->Add('mydb','user=admin,password=123456,age=18') 字符 串类型 *******************************************************************/ public function Add($Table,$Data){ if (!is_array($Data)){ $arr=explode(',',$Data); $Data=array(); foreach ($arr as $val){ list($key,$val)=explode('=',$val); if (!$val) $val=''; $Data[$key]=$val; } } $Fileds='`'.implode('`,`',array_keys($Data)).'`'; $Value="'".implode("','",array_values($Data))."'"; return $this->query("INSERT INTO `{$Table}` ({$Fileds}) VALUES ({$Value})"); } /****************************************************************** -- 函数名:Set($Table,$Data,$Condition,$unQuot) -- 作 用:更改数据 -- 参 数:$Table 表名(必填) $Data 待更改数据,可以为数组(必填) $Condition 更改条件(选填) $unQuot 不需要加引号的字段,用于字段的加减运算等情况,多个 字段用,分隔或者写入一个数组(选填) -- 返回值:布尔 -- 实 例:$DB->Set('mydb',array ('user'=>'admin','password'=>'123456','WHERE id=1') 数组类型 $DB->Set('mydb',"user='admin',password='123456'",'WHERE id=1') 字符串类型 *******************************************************************/ public function Set($Table,$Data,$Condition='',$unQuot=''){ if (is_array($Data)){ if (!is_array($unQuot)) $unQuot=explode(',',$unQuot); foreach ($Data as $key=>$val){ $arr[]=$key.'='.(in_array($key,$unQuot)?$val:"'$val'"); } $Value=implode(',',$arr); }else $Value=$Data; return $this->query("UPDATE `{$Table}` SET {$Value} {$Condition}"); } /****************************************************************** -- 函数名:Del($Table,$Condition) -- 作 用:删除数据 -- 参 数:$Table 表名(必填) $Condition 删除条件(选填) -- 返回值:布尔 -- 实 例:$DB->Del('mydb','id=1') *******************************************************************/ public function Del($Table,$Condition=''){return $this->query ("DELETE FROM `{$Table}`".($Condition?" WHERE {$Condition}":''));} // 取得结果数据 public function result($result=''){ if (empty($result)) $result=$this->result; if ($result==null) $this->show_error('未获取到查询结果',true); return mysql_result($result); } /****************************************************************** -- 函数名:fetch_array($Table,$Condition) -- 作 用:根据从结果集取得的行生成关联数组 -- 参 数:$result 结果集(选填) $type 数组类型,可以接受以下值:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(选填) -- 返回值:布尔 -- 实 例:$DB->Del('mydb','id=1') *******************************************************************/ public function fetch_array($result='',$type=MYSQL_BOTH){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_array($result,$type); } // 获取关联数组,使用$row['字段名'] public function fetch_assoc($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_assoc($result); } // 获取数字索引数组,使用$row[0],$row[1],$row[2] public function fetch_row($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_row($result); } // 获取对象数组,使用$row->content public function fetch_obj($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_object($result); } // 取得上一步 INSERT 操作产生的 ID public function insert_id(){return mysql_insert_id();} // 指向确定的一条数据记录 public function data_seek($id){ if ($id>0) $id=$id-1; if (!mysql_data_seek($this->result,$id)) $this->show_error('指定 的数据为空'); return $this->result; } /****************************************************************** 函数名:num_fields($result) 作 用:查询字段数量 参 数:$Table 数据库表名(必填) 返回值:字符串 实 例:$DB->num_fields("mydb") *******************************************************************/ public function num_fields($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_num_fields($result); } // 根据select查询结果计算结果集条数 public function num_rows($result=''){ if (empty($result)) $result=$this->result; $rows=mysql_num_rows($result); if ($result==null){ $rows=0; $this->show_error('未获取到查询结果',true); } return $rows>0?$rows:0; } // 根据insert,update,delete执行结果取得影响行数 public function affected_rows(){return mysql_affected_rows();} // 获取地址栏参数 public function getQuery($unset=''){ //$unset表示不需要获取的参数, 多个参数请用,分隔(例如:getQuery('page,sort')) if (!empty($unset)){ $arr=explode(',',$unset); foreach ($arr as $val) unset($_GET[$val]); } foreach ($_GET as $key=>$val) $list[]=$key.'='.urlencode($val); return is_array($list)?implode('&',$list):''; } /****************************************************************** 函数名:getPage($Table,$Fileds,$Condition,$pageSize) 作 用:获取分页信息 参 数:$Table 表名(必填) $Fileds 字段名,默认所有字段(选填) $Condition 查询条件(选填) $pageSize 每页显示记录条数,默认10条(选填) 返回值:字符串 实 例:无 *******************************************************************/ public function getPage($Table,$Fileds='*',$Condition='', $pageSize=10){ if (intval($pageSize)>0){$this->pageSize=intval($pageSize);} if (isset($_GET['page']) && intval($_GET['page'])){$this- >pageNo=intval($_GET['page']);} if (empty($Fileds)){$Fileds='*';} $sql="SELECT * FROM `{$Table}` {$Condition}"; $this->query($sql); $this->rsAll=$this->num_rows(); if ($this->rsAll>0){ $this->pageAll=ceil($this->rsAll/$this->pageSize); if ($this->pageNo<1){$this->pageNo=1;} if ($this->pageNo>$this->pageAll){$this->pageNo=$this- >pageAll;} $sql="SELECT {$Fileds} FROM `{$Table}` {$Condition}".$this- >limit(true); $this->query($sql); } return $this->rsAll; } // 构造分页limit语句,和getPage()函数搭配使用 public function limit($str=false){ $n=($this->pageNo-1)*$this->pageSize; return $str?' LIMIT '.$n.','.$this->pageSize:$n; } // 显示分页,必须和getPage()函数搭配使用 public function showPage($number=true){ $pageBar=''; if ($this->pageAll>1){ $pageBar.='<ul class="page">'.chr(10); $url=$this->getQuery('page'); $url=empty($url)?'?page=':'?'.$url.'&page;='; if ($this->pageNo>1){ $pageBar.='<li><a href="'.$url.'1">首页</a></li>'.chr (10); $pageBar.='<li><a >pageNo-1).'">上页 </a></li>'.chr(10); }else{ $pageBar.='<li class="stop"><span>首页</span></li>'.chr (10); $pageBar.='<li class="stop"><span>上页</span></li>'.chr (10); } if ($number){ $arr=array(); if ($this->pageAll<6){ for ($i=0;$i<$this->pageAll;$i++) $arr[]=$i+1; }else{ if ($this->pageNo<3) $arr=array(1,2,3,4,5); elseif ($this->pageNo<=$this->pageAll&&$this- >pageNo>($this->pageAll-3)) for ($i=1;$i<6;$i++) $arr[]=$this->pageAll-5+$i; else for ($i=1;$i<6;$i++) $arr[]=$this->pageNo-3+$i; } foreach ($arr as $val){ if ($val==$this->pageNo) $pageBar.='<li class="curr"><span>'.$val.'</span></li>'.chr(10); else $pageBar.='<li><a href="'.$url.$val.'">'. $val.'</a></li>'.chr(10); } } if ($this->pageNo<$this->pageAll){ $pageBar.='<li><a >pageNo+1).'">下页 </a>'.chr(10); $pageBar.='<li><a >pageAll.'">尾页 </a></li>'.chr(10); }else{ $pageBar.='<li class="stop"><span>下页</span></li>'.chr (10); $pageBar.='<li class="stop"><span>尾页</span></li>'.chr (10); } $pageBar.='<li class="stop"><span>'; $pageBar.="页次:{$this->pageNo}/{$this->pageAll} {$this- >pageSize}条/页 总记录:{$this->rsAll} 转到:"; $pageBar.="<input id=\"page\" value=\"{$this->pageNo}\" type=\"text\" onblur=\"goPage('{$url}',{$this->pageAll});\" />"; $pageBar.='</span></li></ul>'.chr(10); } echo $pageBar; } // 获得客户端真实的IP地址 public function getip(){ if ($_SERVER['HTTP_X_FORWARDED_FOR']) return $_SERVER ['HTTP_X_FORWARDED_FOR']; elseif ($_SERVER['HTTP_CLIENT_IP']) return $_SERVER ['HTTP_CLIENT_IP']; elseif ($_SERVER['REMOTE_ADDR']) return $_SERVER['REMOTE_ADDR']; elseif (getenv('HTTP_X_FORWARDED_FOR')) return getenv ('HTTP_X_FORWARDED_FOR'); elseif (getenv('HTTP_CLIENT_IP')) return getenv ('HTTP_CLIENT_IP'); elseif (getenv('REMOTE_ADDR')) return getenv('REMOTE_ADDR'); else return ''; } /****************************************************************** -- 函数名:show_error($message,$sql) -- 作 用:输出显示错误信息 -- 参 数:$msg 错误信息(必填) $sql 显示错误的SQL语句,在SQL语句错误时使用(选填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function show_error($msg='',$sql=false){ $err='['.mysql_errno().']'.mysql_error(); if ($sql) $sql='SQL语句:'.$this->sql; if ($this->errLog){ $dirs='error/'; //设置错误日志保存目录 $fileName=date('Y-m-d').'.log'; $filePath=$dirs.$fileName; if (!is_dir($dirs)){ $dirs=explode('/',$dirs); $temp=''; foreach($dirs as $dir){ $temp.=$dir.'/'; if (!is_dir($temp)){ mkdir($temp,0777) or die('__无法建立目录'. $temp.',自动取消记录错误信息'); } } $filePath=$temp.$fileName; } $text="错误事件:".$msg."\r\n错误原因:".$err."\r\n".($sql? $sql."\r\n":'')."客户端IP:".$this->getip()."\r\n记录时间:".date('Y-m-d H:i:s')."\r\n\r\n"; $log='错误日志:__'.(error_log($text,3,$filePath)?'此错误信 息已被自动记录到日志'.$fileName:'写入错误信息到日志失败'); } if ($this->showErr){ echo ' <fieldset class="errlog"> <legend>错误信息提示</legend> <label class="tip">错误事件:'.$err.'</label> <label class="msg">错误原因:'.$msg.'</label> <label class="sql">'.$sql.'</label> <label class="log">'.$log.'</label> </fieldset>'; exit(); } } /****************************************************************** -- 函数名:drop($table) -- 作 用:删除表(请慎用,无法恢复) -- 参 数:$table 要删除的表名,默认为所有(选填) -- 返回值:无 -- 实 例:$DB->drop('mydb') *******************************************************************/ public function drop($table){ if ($table){ $this->query("DROP TABLE IF EXISTS `{$table}`"); }else{ $rst=$this->query('SHOW TABLES'); while ($row=$this->fetch_array()){ $this->query("DROP TABLE IF EXISTS `{$row[0]}`"); } } } /****************************************************************** -- 函数名:makeSql($table) -- 作 用:从数据表读取信息并生成SQL语句 -- 参 数:$table 待读取的表名(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function makeSql($table){ $result=$this->query("SHOW CREATE TABLE `{$table}`"); $row=$this->fetch_row($result); $sqlStr=''; if ($row){ $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="-- Table structure for `{$table}`\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="DROP TABLE IF EXISTS `{$table}`;\r\n{$row[1]};\r \n"; $this->Get($table); $fields=$this->num_fields(); if ($this->num_rows()>0){ $sqlStr.="\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="-- Records of `{$table}`\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; while ($row=$this->fetch_row()){ $comma=''; $sqlStr.="INSERT INTO `{$table}` VALUES ("; for($i=0;$i<$fields;$i++){ $sqlStr.=$comma."'".mysql_escape_string($row [$i])."'"; $comma=','; } $sqlStr.=");\r\n"; } } $sqlStr.="\r\n"; } return $sqlStr; } /****************************************************************** -- 函数名:readSql($filePath) -- 作 用:读取SQL文件并过滤注释 -- 参 数:$filePath SQL文件路径(必填) -- 返回值:字符串/布尔/数组 -- 实 例:无 *******************************************************************/ public function readSql($filePath){ if (!file_exists($filePath)) return false; $sql=file_get_contents($filePath); if (empty($sql)) return ''; $sql=preg_replace('/(\/\*(.*)\*\/)/s','',$sql); //过滤批量注释 $sql=preg_replace('/(--.*)|[\f\n\r\t\v]*/','',$sql); //过滤单行 注释与回车换行符 $sql=preg_replace('/ {2,}/',' ',$sql); //将两个以上的连续空格替 换为一个,可以省略这一步 $arr=explode(';',$sql); $sql=array(); foreach ($arr as $str){ $str=trim($str); if (!empty($str)) $sql[]=$str; } return $sql; } /****************************************************************** -- 函数名:saveSql($sqlPath,$table) -- 作 用:将当前数据库信息保存为SQL文件 -- 参 数:$sqlPath SQL文件保存路径,如果为空则自动以当前日期为文件 名并保存到当前目录(选填) $table 待保存的表名,为空着表示保存所有信息(选填) -- 返回值:字符串 -- 实 例:$DB->saveSql('../mydb.sql'); *******************************************************************/ public function saveSql($sqlPath='',$table=''){ if (empty($table)){ $result=$this->query('SHOW TABLES'); while ($arr=$this->fetch_row($result)){ $str=$this->makeSql($arr[0]); if (!empty($str)) $sql.=$str; } $text="/*************************************************************** \\r\\n"; $text.="-- Database: $this->data\r\n"; $text.="-- Date Created: ".date('Y-m-d H:i:s')."\r\n"; $text.="***************************************************************/ \r\n\r\n"; }else{ $text=''; $sql=$this->makeSql($table); } if (empty($sql)) return false; $text.=$sql; $dir=dirname($sqlPath); $file=basename($sqlPath); if (empty($file)) $file=date('YmdHis').'.sql'; $sqlPath=$dir.'/'.$file; if (!empty($dir)&&!is_dir($dir)){ $path=explode('/',$dir); $temp=''; foreach ($path as $dir){ $temp.=$dir.'/'; if (!is_dir($temp)){ if (!mkdir($temp,0777)) return false; } } $sqlPath=$temp.$file; } $link=fopen($sqlPath,'w+'); if (!is_writable($sqlPath)) return false; return fwrite($link,$text); fclose($link); } /****************************************************************** -- 函数名:loadSql($filePath) -- 作 用:从SQL文件导入信息到数据库 -- 参 数:$filePath SQL文件路径(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function loadSql($filePath){ $val=$this->readSql($filePath); if ($val==false) $this->show_error($filePath.'不存在'); elseif (empty($val)) $this->show_error($filePath.'无有效数 据'); else{ $errList=''; foreach ($val as $sql){ $result=mysql_query($sql); if (!$result) $errList.='执行语句'.$sql.'失败<br />'; } return $errList; } return false; } // 释放结果集 public function free(){mysql_free_result($this->result);} // 关闭数据库 public function close(){mysql_close($this->conn);} // 析构函数,自动关闭数据库,垃圾回收机制 public function __destruct(){ $this->free(); $this->close(); } } ?>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值