中山php|最优网络中山做网站 中山php建站

最优良人

Posts Tagged With: mysql

mysql STRICT_TRANS_TABLES严格模式下提示Field 'id' doesn't have a default value

2012/09/26 at 11:42 » Comments (431)

在别的服务器运行我的网站程序的时候,出现了Field 'id' doesn't have a default value 的提示,意思是这个值我没有提交数据,并且数据库结构没有设置默认值,由于对方的mysql服务器开启了STRICT_TRANS_TABLES严格模式,所以报错了 解决方法是: 如果自己的服务器,有权限修改my.ini的话,打开my.ini,查找 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 修改为 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 然后重启MYSQL 在别人的虚拟空间上当然不可能实现,所以根本的解决方法还是修改自己的数据结构,把非空的字段加上默认值,以后设计数据库要注意这一点,方便程序的移植 more »

mysql所有数据库引擎用法MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE

2011/09/21 at 14:50 » Comments (94)

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。 MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: · MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。 · MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。 注释:MEMORY存储引擎正式地被确定为HEAP引擎。 · InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。 · EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。 · NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。 · ARCHIVE存储引擎被用来无索引地,非常小地覆盖存储的大量数据。 · CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。 · BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。 · FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。 当你创建一个新表的时候,你可以通过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要创建什么类型的表: CREATE TABLE t ...more »

mysql数据库引擎HEAP(MEMORY)的使用,内存表,临时表的用法

2011/09/21 at 14:47 » Comments (407)

HEAP表是访问数据速度最快的MySQL表,他使用保存在内存中的散列索引。但如果MySQL或者服务器重新启动,表中数据将会丢失. 用法:如论坛的在线人数统计,这种表的数据应该是无关紧要的,就几个简单的字段,数据也不多,记录数怎么也不会超过1000吧,但是操作是最频繁的(基本用户的每次动作都要更新这个表). 如何创建内存表? 创建内存表非常的简单,只需注明 ENGINE= MEMORY 即可: CREATE TABLE `tablename` ( `columnName` varchar(256) NOT NUL) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=100000000; 注意: 当内存表中的数据大于max_heap_table_size设定的容量大小时,mysql会转换超出的数据存储到磁盘上,因此这是性能就大打折扣了,所 以我们还需要根据我们的实际情况调整max_heap_table_size,例如在.cnf文件中[mysqld]的下面加入: max_heap_table_size = 2048M 另外在建表语句中还可以通过MAX_ROWS来控制表的记录数。 内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制。 1、heap对所有用户的连接是可见的,这使得它非常适合做缓存。 2、仅适合使用的场合。heap不允许使用xxxTEXT和xxxBLOB数据类型;只允许使用=和<=>操作符来搜索记录 (不允许<、>、<=或>=);不支持auto_increment;只允许对非空数据列进行 索引(not null)。 注:操作符 “<=>” 说明:NULL-safe equal.这个操作符和“=”操作符执行相同的比较操作,不过在两个操作码均为NULL时,其所得值为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。 3、一旦服务器重启,所有heap表数据丢失,但是heap表结构仍然存在,因为heap表结构是存放在实际数据库路径下的,不会自动删除。重启之后,heap将被清空,这时候对heap的查询结果都是空的。 4、如果heap是复制的某数据表,则复制之后所有主键、索引、自增等格式将不复存在,需要重新添加主键和索引,如果需要的话。 5、对于重启造成的数据丢失,有以下的解决办法: a、在任何查询之前,执行一次简单的查询,判断heap表是否存在数据,如果不存在,则把数据重新写入,或者DROP表重新复制某张表。这需要多做一次查询。不过可以写成include文件,在需要用该heap表的页面随时调用,比较方便。 b、对于需要该heap表的页面,在该页面第一次且仅在第一次查询该表时,对数据集结果进行判断,如果结果为空,则需要重新写入数据。这样可以节省一次查询。 c、更好的办法是在mysql每次重新启动时自动写入数据到heap,但是需要配置服务器,过程比较复杂,通用性受到限制。 6、一些预期可能用到的sql语句 //如果表存在,则删除 DROP TABLE IF EXISTS `abc`; //复制整张表xyz为heap表abc(包含所有数据) CREATE TABLE ...more »

mysql字符串替换函数replace

2011/08/27 at 23:07 » Comments (323)

mysql替换字符串函数replace可以实现把某字段的某些字符串替换成其他字符串,例如 update dede_addonarticle set body=replace(body,'news/uploads/allimg/c110826','news/uploads/blank.gif?') 可以把dedecms的文章内容表所有的图片链接替换成空白图片,这样就可以去把已经上传的大量图片删除以节省空间了,在对采集回来的数据尤其有用。 more »

phpmyadmin 默认数据库引擎修改为myisam

2011/08/25 at 12:24 » Comments (356)

phpmyadmin 默认创建的数据库默认的数据库引擎为innodb,如果希望修改为灵活性更高的myisam 在my.ini找到default-storage-engine=innodb,修改为myisam more »

Mysql查询数据表中某字段重复出现的次数,并按照次数排序

2011/08/14 at 02:29 » Comments (419)

利用Mysql中的 的聚合函数 count(*) 可以实现这个功能,例如需要查询data表中name出现次数最多的记录,可以先按照group by name分组,用count算出分组里的条数,再按照count排序: select name,count(*) from data group by name order by count(*) DESC limit 1 不加limit限制将返回按照name重复次数排列的数据 more »

Mysql Having的用法:对group by之后的分组加限制条件

2011/08/14 at 02:27 » Comments (683)

在使用聚合函数之前,我们可以通过where对查询加限制条件,那么如果在group by之后我们要对分组里面的数据再加限制条件怎么办呢?答案是having。 HAVING子句可以让我们筛选成组后的各组数据. WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前. 而 HAVING子句在聚合后对组记录进行筛选。 having子句出现的数据必须在group by 之后,order by 之后 例如在上一篇中对name按照出现次数排序之后,我们还想只查出名字里面含有lin的数据,可以这样写: select name ,count(*) from data group by name having name like '%lin%' order by couny(*) DESC more »

Mysql 子查询的用法

2011/08/14 at 01:00 » Comments (337)

一,子选择基本用法 1,子选择的定义 子迭择允许把一个查询嵌套在另一个查询当中。比如说:一个考试记分项目把考试事件分为考试(T)和测验(Q)两种情形。下面这个查询就能只找出学生们的考试成绩 select * from score where event_id in (select event_id from event where type='T'); 2,子选择的用法(3种)  用子选择来生成一个参考值 在这种情况下,用内层的查询语句来检索出一个数据值,然后把这个数据值用在外层查询语句的比较操作中。比如说,如果要查询表中学生们在某一天的测验成绩,就应该使用一个内层查询先找到这一天的测验的事件号,然后在外层查询语句中用这个事件号在成绩表里面找到学生们的分数记录。具体语句为: select * from score where id=(select event_id from event where date='2002-03-21' and type='Q'); 需要注意的是:在应用这种内层查询的结果主要是用来进行比较操作的分法时,内层查询应该只有一个输出结果才对。看例子,如果想知道哪个美国总统的生日最小,构造下列查询 select * from president where birth=min(birth) 这个查询是错的!因为MySQL不允许在子句里面使用统计函数!min()函数应该有一个确定的参数才能工作!所以我们改用子选择: select ...more »

mysql操作符in between

2011/08/14 at 00:57 » Comments (331)

以下三条sql语句的效果是等效的: SELECT * FROM `logs` WHERE id = 1 or id = 2 or id = 3 SELECT * FROM `logs` WHERE id between 1 and 3 SELECT * FROM `logs` WHERE id ...more »

常用的Mysql语句

2011/08/14 at 00:53 » Comments (492)

1 登陆mysql服务器 mysql -uroot -ppassword 2 进入数据库 use haxinbbs; 3 插入一条记录 insert into user(username,password) values('harryzyp','harryzyp'); sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) 4 查看一个记录或多个 select password,sex(或*) from user where username='harryzyp';(等于 = 不等于 <> 小于 < 大于 > ...more »