第一篇:mysql 数据库自增id 的总结
mysql 数据库自增id 的总结
有一个表StuInfo,里面只有两列 StuID,StuName其中StuID是int型,主键,自增列。现在我要插入数据,让他自动的向上增长,insert into StuInfo(StuID,StuName)values()如何写?
INSERT INTO StuInfo(StuID,StuName)VALUES(NULL, `字符`)或者 INSERT INTO StuInfo(StuName)VALUES(`字符`)
INSERT和REPLACE语句的功能都是向表中插入新的数据。这两条语句的语法类似。它们的主要区别是如何处理重复的数据。INSERT的一般用法
MySQL中的INSERT语句和标准的INSERT不太一样,在标准的SQL语句中,一次插入一条记录的INSERT语句只有一种形式。
INSERT INTO tablename(列名…)VALUES(列值);而在MySQL中还有另外一种形式。
INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;第一种方法将列名和列值分开了,在使用时,列名必须和列值的数一致。如下面的语句向users表中插入了一条记录:
INSERT INTO users(id, name, age)VALUES(123, '姚明', 25);第二种方法允许列名和列值成对出现和使用,如下面的语句将产生中样的效果。INSERT INTO users SET id = 123, name = '姚明', age = 25;如果使用了SET方式,必须至少为一列赋值。如果某一个字段使用了省缺值(如默认或自增值),这两种方法都可以省略这些字段。如id字段上使用了自增值,上面两条语句可以写成如下形式:
INSERT INTO users(name, age)VALUES('姚明',25);INSERT INTO uses SET name = '姚明', age = 25;MySQL在VALUES上也做了些变化。如果VALUES中什么都不写,那MySQL将使用表中每一列的默认值来插入新记录。
INSERT INTO users()VALUES();如果表名后什么都不写,就表示向表中所有的字段赋值。使用这种方式,不仅在VALUES中的值要和列数一致,而且顺序不能颠倒。INSERT INTO users VALUES(123, '姚明', 25);如果将INSERT语句写成如下形式MySQL将会报错。
INSERT INTO users VALUES('姚明',25);2 使用INSERT插入多条记录
看到这个标题也许大家会问,这有什么好说的,调用多次INSERT语句不就可以插入多条记录了吗!但使用这种方法要增加服务器的负荷,因为,执行每一次SQL服务器都要同样对SQL进行分析、优化等操作。幸好MySQL提供了另一种解决方案,就是使用一条INSERT语句来插入多条记录。这并不是标准的SQL语法,因此只能在MySQL中使用。
INSERT INTO users(name, age)VALUES('姚明', 25),('比尔.盖茨', 50),('火星人', 600);上面的INSERT 语句向users表中连续插入了3条记录。值得注意的是,上面的INSERT语句中的VALUES后必须每一条记录的值放到一对(…)中,中间使用“,”分割。假设有一个表table1 CREATE TABLE table1(n INT);
如果要向table1中插入5条记录,下面写法是错误的: INSERT INTO table1(i)VALUES(1,2,3,4,5);MySQL将会抛出下面的错误
ERROR 1136: Column count doesn't match value count at row 1 而正确的写法应该是这样:
INSERT INTO t able1(i)VALUES(1),(2),(3),(4),(5);当然,这种写法也可以省略列名,这样每一对括号里的值的数目必须一致,而且这个数目必须和列数一致。如:
INSERT INTO t able1 VALUES(1),(2),(3),(4),(5);3 REPLACE语句
我们在使用数据库时 可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误。当然,我们可能想用新记录的值来覆盖原来的记录值。如果使用传统的做法,必须先使用DELETE语句删除原先的记录,然后再使用INSERT插入新的记录。而在MySQL中为我们提供了一种新的解决方案,这就是REPLACE语句。使用REPLACE插入一条记录时,如果不重复,REPLACE就和 INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。
使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。
在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。
在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。如果返回的值大于2,那说明 有多个唯一索引,有多条记录被删除和插入。
REPLACE的语法和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。
REPLACE INTO users(id,name,age)VALUES(123, '赵本山', 50);插入多条记录:
REPLACE INTO users(id, name, age)VALUES(123, '赵本山', 50),(134,'Mary',15);REPLACE也可以使用SET语句
REPLACE INTO users SET id = 123, name = '赵本山', age = 50;
第1页 上面曾提到REPLACE可能影响3条以上的记录,这是因为在表中有超过一个的唯一索引。在这种情况下,REPLACE将考虑每一个唯一索引,并对每一个索引对应的重复记录都删除,然后插入这条新记录。假设有一个table1表,有3个字段a, b, c。它们都有一个唯一索引。
CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE);假设table1中已经有了3条记录 a b c 1 1 1 2 2 2 3 3 3 下面我们使用REPLACE语句向table1中插入一条记录。REPLACE INTO table1(a, b, c)VALUES(1,2,3);返回的结果如下
Query OK, 4 rows affected(0.00 sec)在table1中的记录如下 a b c 1 2 3 我们可以看到,REPLACE将原先的3条记录都删除了,然后将(1, 2, 3)插入。UPDATE UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围。
UPDATE table_anem SET column_name1 = value1, column_name2 = value2,...WHERE...;如下面的语句将users表中id等于123的记录的age改为24 UPDATE users SET age = 24 WHERE id = 123;同样,可以使用UPDATE更新多个字段的值 UPDATE users SET age = 24, name = 'Mike' WHERE id = 123;上面的UPDATE语句通过WHERE指定一个条件,否则,UPDATE将更新表中的所有记录的值。
在使用UPDATE更新记录时,如果被更新的字段的类型和所赋的值不匹配时,MySQL将这 个值转换为相应类型的值。如果这个字段是数值类型,而且所赋值超过了这个数据类型的最大范围,那么MySQL就将这个值转换为这个范围最大或最小值。如果 字符串太长,MySQL就将多余的字符串截去。如果设置非空字段为空,那么将这个字段设置为它们的默认值,数字的默认值是0,字符串的默认值是空串(不是 null,是“")。
有两种情况UPDATE不会对影响表中的数据。
1.当WHERE中的条件在表中没有记录和它匹配时。2.当我们将同样的值赋给某个字段时,如将字段abc赋为'123',而abc的原值就是'123'。和INSERT、REPLACE一样,UPDATE也返回所更新的记录数。但这些记录数并不包括满足WHERE条件的,但却未被更新的记录。如下同的UPDATE语句就未更新任何记录。
UPDATE users SET age = 30 WHERE id = 12;Query OK, 0 rows affected(0.00 sec)
第2页 需要注意的时,如果一个字段的类型是TIMESTAMP,那么这个字段在其它字段更新时自动更新。
在有些时候我们需要得到UPDATE所选择的行数,而不是被更新的行数。我们可以通过一些API来达到这个目的。如MySQL提供的C API提供了一个选项可以得到你想要的记录数。而MySQL的JDBC驱动得到的默认记录数也是匹配的记录数。
UPDATE和REPLACE基本类似,但是它们之间有两点不同。1.UPDATE在没有匹配记录时什么都不做,而REPLACE在有重复记录时更新,在没有重复记录时插入。
2.UPDATE可以选择性地更新记录的一部分字段。而REPLACE在发现有重复记录时就将这条记录彻底删除,再插入新的记录。也就是说,将所有的字段都更新了。DELETE和TRUNCATE TABLE 在MySQL中有两种方法可以删除数据,一种是DELETE语句,另一种是TRUNCATE TABLE语句。DELETE语句可以通过WHERE对要删除的记录进行选择。而使用TRUNCATE TABLE将删除表中的所有记录。因此,DELETE语句更灵活。
如果要清空表中的所有记录,可以使用下面的两种方法: DELETE FROM table1 TRUNCATE TABLE table1 其中第二条记录中的TABLE是可选的。
如果要删除表中的部分记录,只能使用DELETE语句。DELETE FROM table1 WHERE...;如果DELETE不加WHERE子句,那么它和TRUNCATE TABLE是一样的,但它们有一点不同,那就是DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0。
如果一个表中有自增字段,使用TRUNCATE TABLE和没有WHERE子句的DELETE删除所有记录后,这个自增字段将起始值恢复成1.如果你不想这样做的话,可以在DELETE语句中加上永真的WHERE,如WHERE 1或WHERE true。
DELETE FROM table1 WHERE 1;上面的语句在执行时将扫描每一条记录。但它并不比较,因为这个WHERE条件永远为true。这样做虽然可以保持自增的最大值,但由于它是扫描了所有的记录,因此,它的执行成本要比没有WHERE子句的DELETE大得多。
DELETE和TRUNCATE TABLE的最大区别是DELETE可以通过WHERE语句选择要删除的记录。但执行得速度不快。而且还可以返回被删除的记录数。而TRUNCATE TABLE无法删除指定的记录,而且不能返回被删除的记录。但它执行得非常快。
和标准的SQL语句不同,DELETE支持ORDER BY和LIMIT子句,通过这两个子句,我们可以更好地控制要删除的记录。如当我们只想删除WHERE子句过滤出来的记录的一部分,可以使用LIMIB,如果要删除后几条记录,可以通过ORDER BY和LIMIT配合使用。假设我们要删除users表中name等于”Mike“的前6条记录。可以使用如下的DELETE语句:
DELETE FROM users WHERE name = 'Mike' LIMIT 6;一般MySQL并不确定删除的这6条记录是哪6条,为了更保险,我们可以使用ORDER BY对记录进行排序。
DELETE FROM users WHERE name = 'Mike' ORDER BY id DESC LIMIT 6;将B表查询的数据插入A表: insert into A select。。from B where。。
第3页 or insert into A(。。)select。。from B where。。将B表的值更新到A表:
update A set a =(select b from B where B.id = A.id)where exists(select 1 from B where id = A.id)and。。
同时删除多表数据:
delete A,B from A,B where A.id = B.id and。。or delete from A,B using A,B where A.id = B.id and。。
1.建表时就创建自增列: create table test(id int auto_increment primary key, name varchar(20)not null, password varchar(20)not null);
insert into test values(null,'aa','aa');insert into test values(null,'bb','bb');
注意:
插入语句时,自增列的值为NULL。
2、创建表格后添加: alter table table1 add id int auto_increment primary key自增字段,一定要设置为primary key.注:只有int类型且为primary key 才可以使用auto_increment.如果用hibernate作为持久层,那么主键ID处用identity类型.对于一个表主键的选择,从架构设计角度来说,尽量设计一个与业务无关的字段来作为主键会对系统更好 当然,这势必会增加表数据量的大小,可能有些人会认为这个副作用不值得而选择一个有业务意义的字段(或者多个字段)来作为主键
但是对于大多数时候,这个字段所增加的物理存储空间实际上是很小的,并没有很多人想象的那么可怕。而带来逻辑上的简单是很可观的。
另外,是否选择自增类型作为主键,这个可以说是各有好处,如果用自增,应用可以不care这个主键的值得设定,但是有在高并发下成为瓶颈的风险,当然如果并发并不是非常非常高的话,一般不会成为瓶颈。如果自己控制这个主键值的话,更需要付出一点点代价来生成这
第4页 个值,并发问题可以通过扩展应用集群来解决。
2种解决办法
1.修改你的数据库表,将ID设为自增长,注:只有主键才可以设置为自增长
例:CREATE TABLE `message `(`id` INT(8)NOT NULL AUTO_INCREMENT, PRIMARY KEY(`id`));
2.代码中进行处理
Statement ps;ResultSet rs;int id = 0;..................String sql=”select max(id)as id from message“;rs = ps.executeQuery(sql);//查询出最大ID if(rs.next){//如果有ID,原有ID+1 id = rs.getInt(”id“)+1;
}else{//否则 ID 初始为0 id = 0;}
//下面接你写的代码就OK了
PreparedStatement ps;
String sql=”insert message(id,name,msg)value(?,?,?)"
ps.setString(1,id);ps.setString(2,name);ps.setString(3,msg);
第5页
第二篇:mysql数据库要点总结
查询(R)Selec子句
书写顺序
Select distinct:要返回的列或表达式 From:从中检索数据的表 Where:行级过滤/分组前过滤 group by:分组说明
having:组级过滤/分组后过滤 order by:输出排序顺序desc/asc limit start, count:要检索的行数 limit 3,4 从第3行开始的连续4行
SELECT order_num,sum(quantity*item_price)ordertotal FROM orderitems WHEREorder_numBETWEEN20005AND 20009GROUP BY order_num HAVINGsum(quantity*item_price)>=50ORDER BYordertotalDESCLIMIT4;执行顺序
From表名->inner/left/right/ join on->where->group by->select distinct *->having->order by->limit start, count 插入Insert into(C)INSERT INTO students(name)values(‘杨过’),(‘小龙女’);更新(U)Update UPDATE customers SETcust_email = ‘elmer@fudd.com’WHEREcust_id = 10005;删除(D)Delete DELETE FROM customers WHEREcust_id = 10006;Truncate删除原来的表并重新创建一个表,删除标的全部内容时效率高。
操作表
创建CREATE TABLE customers(Cust_idint not null auto_increment primary key,Cust_name char(50)not null,Cust_addresschar(50)null)engine = innoDB;更新ALTER TABLE删除DROP TABLEcustomers2;重命名RENAME TABLE customers2 TO customers;操作数据库
创建CREATE DATABASE xxx charset = utf8;删除DROP DATABASEXXX;切换USE XXX;查看SHOW DATABASES;关联查询
INNER/LEFT/RIGHTJOIN ON SELECT students.name,subjects.title,scores.scoreFROM scores INNER JOIN students ONscores.stuid = students.id INNER JOIN subjects ONscores.subid = subjects.id;
第三篇:Mysql数据库学习心得
Mysql数据库学习心得(1)
由于工作中需要使用mysql,笔者通过网上学习,动手实践,终于从一个“数据库菜鸟”变成了能熟练操作mysql的“准大虾”了,:)。现将学习心得整理如下。
MySQL是完全网络化的跨平台关系型数据库系统,一个真正的多用户、多线程SQL数据库服务器,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使
用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问MySQL数据库的程序,对于中、小型应用系统是非常理想的。除了支持标准的ANSI SQL语句,更重要的是,它还支持多种平台,而在Unix系统上该软件支持多线程运行方式,从而能获得相当好的性能。对于不使用Unix的用户,它可以在Windows NT系统上以系统服务方式运行,或者在Windows 95/98系统上以普通进程方式运行。而在Unix/Linux系统上,MySQL支持多线程运行方式,从而能获得相当好的性能,而且它是属于开放源代码软。
MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成,MySQL的执行性能非常高,运行速度非常快,并非常容易使用,是一个非常棒的数据库。MySQL的官方发音是“My Ess Que Ell”(不是MY-SEQUEL)。
一.获得MySQL
首先必须下载MySQL。Mysql的官方网站是:www.xiexiebang.comf copy为c:my.cnf,并把c:mysqlibgwinb19.dll copy到winntsystem32。
3。启动mysql的方法是:
c:mysqlinmysqld-shareware--install
net start mysql
这么简单,就可以启动了。
4。更改超级用户(root)的密码:
C:mysqlinmysql mysql
mysql> UPDATE user SET password=PASSWORD('your password')swheresuser='root';
mysql> QUIT
C:mysqlinmysqladmin reload
使用命令C:mysqlinmysqlshow去看看检测一下。在这里应该显示:
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+
看到这些信息这一步就证明没问题了
再来:
C:mysqlinmysqlshow--user=root--password=your password mysql
在这里应该显示:
Database: mysql
+--------------+
| Tables |
+--------------+
| columns_priv |
| db |
| host |
| tables_priv |
| user |
+--------------+
一切搞定!
5。C:mysqlinmysqladmin version status proc
应该可以看到这些版本信息的:
mysqladmin Ver 8.0 Distrib 3.22.32, for Win95/Win98 on i586
TCX Datakonsult AB, by Monty
Server version 3.22.32-shareware-debug
Protocol version 10
Connection localhost via TCP/IP
TCP port 3306
Uptime: 1 hour 29 min 30 sec
Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K Max memory
used: 16490K
Uptime: 5370 Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K
Max memory used: 16490K
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+----+---------+------+-------+------------------+
| 35 | ODBC | localhost | | Query | 0 | | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
接着,用show databases命令可以将安装的数据库列出来:
mysql> show databases;
你就可以看到:
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+ rows in set(0.00 sec)
如果一切正常的话,那说明MySQL可以完全工作了!如果要退出程序,输入:exit
mysql> exit;
Bye
Mysql数据库学习心得(3)------------------
三.Mysql常识
(一)字段类型
1.INT[(M)]
正常大小整数类型
2.DOUBLE[(M,D)] [ZEROFILL]
正常大小(双精密)浮点数字类型
3.DATE
日期类型。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给
DATE列
4.CHAR(M)
定长字符串类型,当存储时,总是是用空格填满右边到指定的长度
5.BLOB TEXT
BLOB或TEXT类型,最大长度为65535(2^16-1)个字符。
6.VARCHAR
变长字符串类型,最常用的类型。
(二)基本操作
1:显示数据库
mysql>SHOW DATABASES;
2:当前选择的数据库,mysql> SELECT DATABASE();
+------------+
| DATABASE()|
+------------+
| test |
+------------+
3.当前数据库包含的表信息:
mysql> SHOW TABLES;
+---------------------+
| Tables in test |
+---------------------+
| mytable1 |
| mytable2 |
+---------------------+
4.获取表结构
mysql> desc mytable1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| s1 | varchar(20)| YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5.创建表
表是数据库的最基本元素之一,表与表之间可以相互独立,也可以相互关联。创建表的基本语法如下:
create table table_name
(column_name datatype {identity |null|not null},…)
其中参数table_name和column_name必须满足用户数据库中的识别器(identifier)的要求,参数datatype是一个标准的SQL类型或由用户数
据库提供的类型。用户要使用non-null从句为各字段输入数据。
create table还有一些其他选项,如创建临时表和使用select子句从其他的表中读取某些字段组成新表等。还有,在创建表是可用PRIMARY
KEY、KEY、INDEX等标识符设定某些字段为主键或索引等。书写上要注意:在一对圆括号里的列出完整的字段清单。字段名间用逗号隔开
。字段名间的逗号后要加一个空格。最后一个字段名后不用逗号。所有的SQL陈述都以分号“;”结束。
例:
mysql>CREATE TABLE guest(name varchar(10),sex varchar(2),age int(3),career varchar(10));
6.创建索引
索引用于对数据库的查询。一般数据库建有多种索引方案,每种方案都精于某一特定的查询类。索引可以加速对数据库的查询过程。创建
索引的基本语法如下:
create index index_name
on table_name(col_name[(length)],...)
例:
mysql> CREATE INDEX number ON guest(number(10));
7.执行查询
查询是使用最多的SQL命令。查询数据库需要凭借结构、索引和字段类型等因素。大多数数据库含有一个优化器(optimizer),把用户的查
询语句转换成可选的形式,以提高查询效率。
值得注意的是MySQL不支持SQL92标准的嵌套的where子句,即它只支持一个where子句。其基本语法如下:
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]
其中where从句是定义选择标准的地方,where_definition可以有不同的格式,但都遵循下面的形式:
字段名操作表达式
字段名操作字段名
在第一种形式下,标准把字段的值与表达式进行比较;在第二种形式下,把两个字段的值进行比较。根据所比较的数据类型,search_condition中的操作可能选以下几种:
=检查是否相等
!=检查是否不等
>(或>=)检查左边值是否大于(或大于等于)右边值
<(或<=)检查左边值是否小于(或小于等于)右边值
[not] between检查左边值是否在某个范围内
[not] in检查左边是否某个特定集的成员
[not] like检查左边是否为右边的子串
is [not] null检查左边是否为空值
在这里,可以用通配符_代表任何一个字符,%代表任何字符串。使用关键字、和可以生成复杂的词,它们运行检查时使用
布尔表达式的多重标准集。
例:
mysql> select t1.name, t2.salary from employee AS t1, info AS t2swherest1.name = t2.name;
mysql> select college, region, seed from tournament
ORDER BY region, seed;
mysql> select col_name from tbl_nameswherescol_name > 0;
8.改变表结构
在数据库的使用过程中,有时需要改变它的表结构,包括改变字段名,甚至改变不同数据库字段间的关系。可以实现上述改变的命令是
alter,其基本语法如下:
alter table table_name alter_spec [, alter_spec...]
例:
mysql> alter table dbname add column userid int(11)not null primary key auto_increment;
这样,就在表dbname中添加了一个字段userid,类型为int(11)。
9.修改表中数据
在使用数据库过程中,往往要修改其表中的数据,比如往表中添加新数据,删除表中原有数据,或对表中原有数据进行更改。它们的基本
语法如下:
数据添加:
insert [into] table_name [(column(s))]
values(expression(s))
例:
mysql>insertsintosmydatabase values('php','mysql','asp','sqlserver','jsp','oracle');Mysql数据库学习心得(4)------------------
10.表的数据更新
(1)一次修改一个字段,再次注意语法。文本需要加引号但数字不要。
mysql>update table01 set field03='new info'swheresfield01=1;
Query OK, 1 row affected(0.00 sec)
(2)一次改变多个字段,记住在每一个更新的字段间用逗号隔开。
mysql>update table01 set field04=19991022, field05=062218swheresfield01=1;
Query OK, 1 row affected(0.00 sec)
(3)一次更新多个数据
mysql>update table01 set field05=152901swheresfield04>19990101;
Query OK, 3 rows affected(0.00 sec)
11.删除数据
mysql>delete from table01swheresfield01=3;
Query OK, 1 row affected(0.00 sec)
12.导入数据库表
(1)创建.sql文件
(2)先产生一个库如auction.c:mysqlin>mysqladmin-u root-p creat auction,会提示输入密码,然后成功创建。
(3)导入auction.sql文件
c:mysqlin>mysql-u root-p auction < auction.sql。
通过以上操作,就可以创建了一个数据库auction以及其中的一个表auction。
13.mysql数据库的授权
mysql>grant select,insert,delete,create,drop
on *.*(或test.*/user.*/..)
to用户名@localhost
identified by '密码';
如:新建一个用户帐号以便可以访问数据库,需要进行如下操作:
mysql> grant usage
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected(0.15 sec)
此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到数据库并可以连接到test数据库。下一步,我们必须指定
testuser这个用户可以执行哪些操作:
mysql> GRANT select, insert, delete,update
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected(0.00 sec)
此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户
程序:
mysql> exit
Bye
14.授权MySQL用户密码
MySQL数据库的默认用户名为“root”(MS SQL Server的sa相似),密码默认为空。在DOS提示符(注 意,不是mysql提示符)下输入
c:mysqlin>“mysqladmin-u root-p password newpassword
回车后会提示你输入原来的密码,由于原来密码为空,直接回车,root用户的密码便改为”newpassword“了。
Mysql数据库学习心得(5)------------------
四.安装phpMyAdmin
MySQL图形界面管理器phpMyAdmin是一套以php3写成,针对MySQL数据库系统的Web管理界面。它可以很方便地以图形化界面,来对MySQL数据库里的字段、数据进行增加、删除等的动作,更可以做数据库本身的增删管理;phpMyAdmin可以管理整个MySQL服务器(需要超级用户),也可以管理单个数据库。另外,您也可以通过使用这个图形化界面来学习SQL正确的语法,直至熟练掌握。那要等到你看过MySQL手册中相关的部分。你可以到http://www.phpwizard.net/phpMyAdmin/去下载最新的版本。
首先,将phpMyAdmin软件包解到一个目录下。
1.修改文档config.inc.php3。
将原来的设定:
§cfgServers[1]['host'] = '';// MySQL hostname
§cfgServers[1]['port'] = '';// MySQL port-leave blank fordefault port
§cfgServers[1]['adv_auth'] = false;// Use advanced authentication?
§cfgServers[1]['stduser'] = '';// MySQL standard user(only needed with advanced auth)
§cfgServers[1]['stdpass'] = '';// MySQL standard password(only needed with advanced auth)
§cfgServers[1]['user'] = '';// MySQL user(only needed withbasic auth)
§cfgServers[1]['password'] = '';// MySQL password(only needed with basic auth)
§cfgServers[1]['only_db'] = '';// If set to a db-name, only this db is accessible
§cfgServers[1]['verbose'] = '';// Verbose name for this host-leave blank to show the hostname
:
:
require(”english.inc.php3“);
修改成:
§cfgServers[1]['host'] = 'MySQL Server的hostname';//填入您的MySQL Server的主机名称
§cfgServers[1]['port'] = '';//填入连结MySQL的port,不填则以预设的port进行连结
§cfgServers[1]['adv_auth'] = true;//改成true则进入phpMyAdmin必须先身份认证
§cfgServers[1]['stduser'] = 'root';// MySQL使用者的帐号
§cfgServers[1]['stdpass'] = '密码';// MySQL使用者的密码
§cfgServers[1]['user'] = 'root';// MySQL管理帐号
§cfgServers[1]['password'] = '密码';// MySQL管理密码
§cfgServers[1]['only_db'] = '';//指定管理的资库名称,不填则可以管理整个Server
§cfgServers[1]['verbose'] = '';//指定MySQL的名称,不填则使用系统本身的hostname
:
:
require(”chinese_gb.inc.php3");//将语言改成中文
说明:
(1)因本管理接口,可以以一个接口,管理多个MySQL Server,所以可以在config.inc.php3中找到
§cfgServers[1]...§cfgServers[1]...§cfgServers[1]...:
§cfgServers[2]...§cfgServers[2]...§cfgServers[2]...其中[1]代表第一个MySQL Server,[2]代表第二个MySQL Server,您要管理的MySQL Server超过三台以上,您可以依照同样的?述,增加[4].....下去!
(2)若您的MySQL Server与http Server是同一台,则§cfgServers[1]['host'] =可直接填入localhost。
最后,打开流览器,输入你的网址/phpMyAdmin之后您会看到一个密码验证的小窗口,输入您的MySQL管理帐号及密码,即可成功地看到phpMyAdmin的管理画面。通过phpmyadmin,你就可以图形化的、方便的管理你的所有数据库了。
五.小结
通过以上的学习和操作,终于可以自由操作mysql数据库了,也可以轻车熟路的使用php或者asp调用mysql了。最后,笔者要特别感谢开发了mysql并且免费贡献的天才以及在网上提供mysql使用说明的大虾们。
第四篇:计算机二级《MySQL数据库程序设计》知识点总结
MySQL知识点总结
.数据操作:检索、排序、过滤、分组、汇总、计算、联接、子查询与组合查询.表操作:表的创建、修改、删除和重命名、表数据的插入、更新和删除.索引(含主、外键)、视图
.难度编程:存储过程与存储函数、触发器与事件、PHP.数据库管理:事务处理、用户与权限、备份与还原、数据库维护
1.检索数据:select„from„
Select [distinct] prod_id,prod_name from products [limit 4,5];2.检索排序:order by„
Select * from products order by prod_id [asc|desc],prod_name [asc|desc];3.过滤数据:where 字句
= <>!= >>= <<= between(1)普通where 字句
Select prod_id,prod_name from products where prod_name=’liyang’;Select prod_id,prod_name from products where prod_id between 10 and 50;Select prod_id,prod_name from products where prod_name is [not] null;(2)组合where字句:使用AND和OR连接多个条件表达式,且AND次序优于OR;(3)IN 与NOT操作符
Select prod_id,prod_name from products where prod_id [not] in(1,2,3)|prod_name in(’zhangsan’,’lisi’,’wangwu’);(4)LIKE操作符与通配符:“%”与“_”
Select prod_id,prod_name from products where prod_name like ’%liu%’;Select prod_id,prod_name from products where prod_name like ’_u%’;找出u位于名字的第二个位置的prod_id和prod_name。(5)正则表达式 4.计算字段
(1)拼接字段:concat(„,„)Select concat(姓氏,名字)as 姓名 from orders;Select concat(vend_name,’(’,vend_country,’)’)from vendors;(2)算术运算
Select prod_name,prod_price,prod_num,prod_price*prod_num as prod_money from products;4.使用数据处理函数:文本处理函数、日期和时间处理函数、数值处理函数。5.汇总数据:聚集函数 SUM()AVG()COUNT()MAX()MIN()Select avg(distinct prod_price)from products;Select avg(prod_price)均价,max(prod_price)最高价 from products;6.分组数据:group by„ 创建分组、过滤分组、分组排序
Select count(prod_id),prod_id from products where prod_id>1000 group by prod_id having count(prod_id)>2 order by prod_id;求出prod_id大于1000且产品数量大于2的产品数量,并按prod_id排序,注意分组语句中对象要前后一致,如下划线部分。7.使用子查询:进行过滤select„where„in(select„where„in(select„))、作为计算字段使用子查询。8.联接:join„on„(1)普通联接
Select oi.order_num,oi.prod_id,p.prod_name,p.vend_id,v.vend_name from orderitems oi join products p on oi.prod_id=p.prod_id join vendors v on p.vend_id=v.vend_id where vend_name=’liyang’;可同时联接多个表且可同时用于数据过滤,这种类型的联接一般为内部联接。
(2)自联接:一个表自己与自己联接,注意判断好各字段与前后两个表的关系。(3)自然联接:基本上简历的内部联接都是自然联接。
(4)外部联接:在关系表中没有关联的信息的行也能显示出来的联接,根据表在join字句的左边还是右边可分为左联接与右联接。(5)带聚集函数的联接
Select c.cust_id,count(o.order_num)num_ord from customers c join orders o on c.cust_id=o.cust_id order by c.cust_id;找出客户对应的订单数。
9.组合查询:连接多个(至少两个)查询语句,满足其中一个查询语句条件的结果都会显示出来 union(不重复显示)/union all(可重复显示即全部显示)Select vend_id,prod_id,prod_price from products where prod_price<=5 Union [all] Select vend_id,prod_id,prod_price from products where vend_id in(1001,1002)order by prod_id;注意每个查询必须包含相同的列、表达式或者聚集函数,列的数据类型必须兼容,排序语句只能放在最后面,该排序语句对组合查询语句中的所有select语句都适用。10.全文本搜索:只支持引擎为MyISAM的表,不支持引擎为InnoDB的表,可对搜索结果进行智能排序后输出,具有较高等级的行先返回。
Match(全文本搜索字段)against(’全文本搜索内容’[with query expansion])其中下划线部分为拓展语句,使用该语句,除了可以返回符合所设置的“全文本搜索内容”的数据结果,还可返回与“全文本搜索内容”有较高相似度的数据结果。(1)启用全文本搜索支持
Create table fs(id int not null primary key,c text,c1 text,fulltext(c,c1))engine=MyISAM;(2)进行全文本搜索
Select note_text from productnotes where match(note_text)against(’liyang’ with query expansion);11.插入数据:insert into„{values|select}„
Insert into products(prod_id,prod_name,prod_price)values(1,’豆浆’,2),(3,’鸡蛋’,1);可同时插入多行数据。
Insert into products(prod_id,prod_name,prod_price)select vend_id,vend_name, vend_price from vendors where vend_id<=10;12.更新数据:update [ignore]„set„,一般情况下,若更新的数据中有部分数据出错,则全部数据返回到原来的数据,而ignore的作用在于即使更新的数据中出现错误,只对出现错误的数据返回到原来数据,而未出现错误的数据返回更新后的结果实现更新。update products set prod_name='馒头',prod_price=1 where prod_id=1;update customers set cust_city=concat(cust_city,’市’)| cust_city =replace(cust_city,’市’,’city’)where cust_id>1000;13.删除数据:delete from„ Delete from products where prod_id between 10 an 50;14.表的相关操作
(1)创建表:对表结构进行设置create table„
Create table products(prod_id int null auto_increment primary key,prod_name varchar(50),prod_price int,prod_city varchar(50)default ’广州’)engine= InnoDB;每个字段名后需要设置数据类型,default为指定默认值,只支持常量不支持函数,且只在插入数据时起作用而在更新数据时不起作用,InnoDB是一个可靠的事务处理引擎,但不支持全文本搜索。
(2)更新表:对表结构进行修改 alter table {add|drop}„
Alter table products add prod_city varchar(50); Alter table products drop prod_price;(3)删除表:一旦删除,无法撤销 drop table„
Drop table products;(4)重命名表:rename table„to„
Rename table products to new_products;15.索引的相关操作
(1)创建索引:常用于数据的快速检索,MySQL中,常用索引在物理可分为:BTREE、HASH索引两类;在具体用途上可分为:INDEX、UNIQUE、PRIMARY KEY、FOREIGN KEY、FULL TEXT、SPATIAL等。
1使用create index 语句创建索引,对已存在的表创建索引 ○Create [unique|fulltext|spatial] index index_name [using BTREE|HASH] on tbl_name(index_col_name[,index_col_name„]);Create unique index index_products on products(prod_name(2)desc,prod_price);2使用create table 语句创建索引,创建表的同时创建索引 ○Create table seller(seller_id int not null auto_increment,seller_name char(50),seller_adress char(50),seller_contact char(50),product_type int,sales int,primary key(seller_id,product_type),[unique|fulltext|spatial] index index_seller(sales));3使用alter table语句创建索引,修改表的同时添加索引 ○Alter table tbl_name add {[unique|fulltext|spatial] index index_tbl_name(字段名)|primary key(字段名)|foreign key(字段名)references elsetbl_name(相同字段名)};(2)查看索引:Show index from tbl_name [where expr];(3)删除索引:drop index index_nameon tbl_name语句或alter table语句
Drop index index_name on tbl_name;Alter table tbl_name drop {[unique|fulltext|spatial] index index_tbl_name(字段名)|primary key(字段名)|foreign key(字段名)references elsetbl_name(相同字段名};(下划线部分不确定)16.视图的相关操作
视图:虚拟的表,视图本身不包含表中的列和数据,它包含只是一个SQL查询,常用于 检索数据。*视图的作用与规则。(1)创建视图:Create view view_name as select„[where„];Create view view_products as select prod_id,prod_name,prod_price,prod_num, prod_price*prod_num as prod_money from products where prod_id<=10 [with check option];--下划线部分表示今后对该视图数据的修改都必须符合prod_id<=10(2)查看视图(用法同表): select * from view_name;(3)删除视图:drop view view_name;17.完整性:实体完整性(主键与候选键)、参照完整性(主键与外键)、用户定义的完整性(非空约束与check约束)。
18.创建主键约束:create table语句或alter table语句
Create table products(prod_id int not null auto_increment primary key,c int);作为列的主键约束;
Create table products(prod_id int not null auto_increment,c int,c1 int,primary key(prod_id));作为表的主键约束,且复合主键职能用这种形式创建 Alter table products add primary key(prod_id);备注:实体完整性通过主键约束与候选键约束来实现,候选键约束的创建类似主键约束的创建,实质上同索引。
19.设置表外键:create table语句或alter table语句,外键中列的数目和数据类型必须与被参照表的主键中列的数目和对应数据类型一致。
alter table tbl_name add [constraint fk_name] foreign key(„)references„ Create table products(prod_id int not null auto_increment,c int,c1 int,foreign key(prod_id)references customers(prod_id));alter table products add constraint fk_products_cust foreign key(cust_id)references cust(cust_id);20.存储过程:为了以后的使用而保存的一条或多条SQL语句的集合
--建立存储过程:建立一个可通过输入item_id,输出对应订单总金额的存储过程->Delimiter //--改变分割符为//->create procedure ordertotal(in o_id int,out o_total decimal(10,2))过程名字输入参数及类型输出参数及类型->begin->select sum(item_price*item_num)from orderitems where item_id=o_id into o_total;->if o_total is null then->select ’不存在该订单号’;->end if;->end;->//--执行存储过程:当item_id=200005时,得出对应订单总金额->delimiter;--将分割符改回分号->call ordertotal(200005,@total);--由于不存在输出参数,故定义一个输出变量,变量必须用@开头->select @total;返回结果为149.87 备注:书本第十一章后的编程题,使用update语句,两个参数类型都需要为in。--显示存储过程->Show create procedure ordertotal;--删除存储过程
->Drop procedure ordertotal;21.存储函数
存储函数与存储过程的区别:.存储函数不能拥有输出参数;.存储函数可直接调用,且不需使用call语句,而存储过程的调用必须使用call语句;.存储函数中必须包含一条return语句,而这条特殊的SQL语句不允许包含于存储过程。--建立存储函数:根据给定的cust_id返回客户所在的州名(缩写),若库中无给定的cust_id,则返回“不存在该客户”。->delimiter //->create function fn_search(c_id int)->returns varchar(50)--定义返回的数据类型,与函数部分中的数据类型需统一,如函数中的“不存在该客户”为6个字符,如果这里设置为char(5),则无法输出该结果->deterministic– 表示对于相同的输入值,返回值也相同->begin->declare state char(2);--声明一个变量state,作为输出的州变量->select cust_state from customers where cust_id=c_id into state;->if state is null then->return(select ’不存在该客户’);--注意这里return不用加s->else->return(select state);->end if;->end;->//--执行存储函数
->select fn_search(10001);--删除存储函数
->drop function fn_search;--删除前要确定该函数无依赖关系,即不存在其他存储过程或存储函数调用过该存储函数。
22.触发器:MySQL响应insert、delete、update语句时自动执行的一条MySQL语句,创建触发器时需要给出的4条信息:唯一的触发器名、触发器相关的表、触发器应该响应的活动(insert delete、update)、触发器何时执行(处理前或处理后)。
(1)insert触发器:当对表插入数据时起作用,含有一个虚拟表New,可访问增加的行,只能用after--建立一个insert触发器,用于记录insert语句操作时的系统时间和插入的order_num->delimiter //->create trigger trg_order_insert after insert on orders for each row 触发器 触发器名 执行时间 相关表->begin->insert into order_log(o_date,order_num)values(now(),new.order_num);--order_log是事先建立好的表,用于记录insert语句操作时的系统时间和插入的order_num->end;->//--执行insert触发器->delimiter;->insert into orders(order_date,cust_id)values(’2010-9-15’,10001);--由于order_num是自动递增的,故在这里不作为插入对象(2)delete触发器:当对表删除数据时起作用,含有一个虚拟表Old,可访问被删除的行,只能用after,创建方法与insert类似,区别在于delete和old--建立一个delete触发器,用于记录delete语句操作时的系统时间和删除的order_num->delimiter //->create trigger trg_order_delete after delete on orders for each row 触发器 触发器名 执行时间 相关表->begin->insert into order_log(o_date,order_num)values(now(),old.order_num);--order_log是事先建立好的表,用于记录delete语句操作时的系统时间和删除的order_num->end;->//--执行delete触发器->delimiter;->delete from orders where order_num=20010;(3)update触发器:当对表修改数据时起作用,同时含有new和old两个虚拟表。结合New可访问更新行的记录;结合old可访问更新前行的记录,可用after,也可用before。1用after ○--建立一个update触发器,用于记录update语句操作时的系统时间和更新数据的order_num->delimiter //->create trigger trg_order_update after update on orders for each row 触发器 触发器名 执行时间 相关表->begin->insert into order_log(o_date,order_num)values(now(),old.order_num);->end;->//--执行update触发器->delimiter;->update orders set order_date=’2015-9-18’ where cust_id=10001;2用before ○--建立一个update触发器,如果更新后的prod_price大于原来的1.2倍,则用原来的1.2倍作为当前价格->delimiter //->create trigger trg_order_update before update on orders for each row 触发器 触发器名 执行时间 相关表->begin->if new.prod_price>old.prod_price*1.2 then->set new.prod_price=old.prod_price*1.2;->end if;->end;->//(4)删除触发器:drop trigger trg_name;23.事件:临时触发器,要使用事件调度器,必须开启“event_scheduler”.查看:show variables like ’event_scheduler’;.开启:set global event_scheduler=1;(1)创建事件
CREATE EVENT EVENT_NAME ON SCHEDULE schedule DO event_body;其中schedule的语法格式为
AT timestamp [+INTERVAL interval]„|every interval--指定事件执行的时间,可以为某时刻点即timestamp,或某时刻点开始的interval时间后,或者为每隔interval时间执行一次
[starts timestamp [+INTERVAL interval]]--设置事件开始执行的时间 [ends timestamp [+INTERVAL interval]]--设置事件终止执行的时间
--建立一个事件,用于每个月向customers表中插入一条数据“liyang、广州”,该事件从下个月开始并于2015-12-31结束->delimiter //->create event event_insert on schedule every 1 month->starts curdate()+interval 1 month->ends ’2015-12-31’->do->begin->if year(curdate())<2015 then->insert into customers(cust_name,cust_adress)values(’liyang’,’广州’);->end if;->end;->//(2)修改事件,用于修改时间的状态:alter event event_name{enable|disable};(3)删除事件:drop event event_name;24.管理实务处理:start transaction„
实务处理的术语:
(1)实务(transaction):一组SQL语句;(2)回退(rollback):撤销指定SQL语句的过程;(3)提交(commit):指定未存储的SQL语句结果写入到数据库表里,提交后无法回退;(4)保留点(savepoint):实务处理中设置的临时占位符。
25.安全管理(用户创建修改与删除以及用户权限的查看设置与撤销)(1)创建用户账号:create user ben identified by ’ben’;(2)修改用户账号:update mysql.user set user=’new_ben’ where user=’ben’;--从mysql数据库中的用户表user进行修改(3)查看访问权限:show grants for new_ben;(4)设置访问权限:grant„to„.grant {all|select,update,delete,insert}on {*.*|crashcourse.*|crashcourse.cus tomers} to new_ben;.grant select(cust_id,cust_name)on crashcourse.customers to new_ben;--可针对{整个服务器|整个数据库|数据库中某个表|数据库中某个表的某些字段},对用户同时设置全部或一种或多种权限
(5)撤销访问权限:revoke„from„,用法与grant„to„类似(6)更改口令(密码)
Set password for new_ben=password(’new_ben’);(7)删除用户:drop user new_ben;26.数据库备份与还原.使用SQL语句
backup table tbl_name to„/restore table tbl_name from„(只用于MyISAM表)select„intooutfile„/load data„infile„into table tlb_name.使用命令行实用程序:mysqlhotcopy(只用于MyISAM表)或mysqldump/mysql(1)使用select„intooutfile„/load data„infile„into table tlb_name.备份数据:
Select * from mysql.products into outfile ’d:products.txt’ [Fields terminated by ’,’ optionally enclosed by ’”’
lines terminated by ’nr’;--定义字段间的分割符、字符型数据的存放形式、行与行之间的分割符.恢复数据
Load data infile ’d:products.txt’into table customers.copy [Fields terminated by ’,’ optionally enclosed by ’”’
lines terminated by ’nr’;--必须与备份时一致(2)使用命令行实用程序mysqldump/mysql(文本形式)
进入cmd运行界面(mysqldump—help 可用于获取mysqldump的选项表及更多帮助信息).备份整个数据库服务器、或整个数据库或数据库中某个表
Mysqldump –u root –proot –P 3306 –h localhost {all-databases|mysql_test [products]}>d:data.sql.恢复数据
Mysql –u root –proot –P 3306 –h localhost {all-databases|mysql_test [products]} (1)analyze table tbl_name;更新表的索引散列程度,检查表键是否正确(2)check table tbl_name;检查一个或多个表是否有错误 (3)checksum table tbl_name;对数据库中的表进行校验,保证数据的一致性 (4)optimize table tbl_name;利用表中未使用的空间并整理数据文件碎片,保证数据读取效率 (5)repair table tbl_name;修复一个或多个可能被损害的MyISAM表 28.二进制日志文件的使用:mysqlbinlog 29.使用PHP进行MySQL数据库编程 编程步骤: .首先建立与MySQL数据库服务器的连接;.然后选择要对其进行操作的数据库; .再执行相应的数据库操作,包括对数据的添加、删除、修改和查询等;.最后关闭与MySQL数据库服务器的连接。(1)数据库服务器连接、选择数据库 .使用mysql_connect()建立非持久连接 Php $con=mysql_connect(“localhost:3306”,“root”,“123456”);if(!$con){ echo “数据库服务器连接失败! .使用mysql_pconnect()建立持久连接 ”;echo “用户名:root .使用mysql_select_db(databases[,connection])选择数据库 ”;die();} mysql_select_db(“mysql_test”,$con);if(mysql_errno()){ echo “数据库选择失败! /*向数据库mysql_test中的表customers添加一个名为“李中华”的客户的全部信息*/ ”);Mysql_select_db(“mysql_test”,$con)or die(“数据库选择失败! $sql=“insert into customers(’cust_id’,’cust_name’,’cust_sex’)”;$sql=$sql.“values(null,’李中华’,’M’)”;if(mysql_query($sql,$con))echo “客户信息添加成功! .数据的更新 /*将数据库mysql_test的表customers中的一个名为“李中华”的客户的地址修改为“广州市”*/ ”);Mysql_select_db(“mysql_test”,$con)or die(“数据库选择失败! .数据的删除 /*将数据库mysql_test的表customers中一个名为“李中华”的客户信息删除*/ ”);Mysql_select_db(“mysql_test”,$con)or die(“数据库选择失败! (3)数据库的查询 .使用mysql_fetch_array(data[,array_type])读取结果集中的记录 /*在数据库mysql_test的表customers中查询cust_id为916的客户的姓名*/ ”);Mysql_select_db(“mysql_test”,$con)or die(“数据库选择失败! .使用mysql_num_rows(data)读取结果集中的记录数 /*在数据库mysql_test的表customers中查询女性客户的人数*/ ”);Mysql_select_db(“mysql_test”,$con)or die(“数据库选择失败! 当应用程序和数据库建立连接时,如果超过了8个小时,应用程序不去访问数据库,数据库就会出现断掉连接的现象。这时再次访问就会抛出异常.一般的解决方法大多是在数据库连接字符串中增加“autoReconnect=true ”选项。但是这只对mysql4以前的版本有效。在最新的mysql中是无效的。其实要解决这个问题也有一个简单的方法,就是修改mysql的启动参数。缺省情况下mysql的timeout时间是28800秒,正好是8小时,增加一个0就可以了。决定从根源入手,设置mysql的wait_timeout为31536000(一年),再来试试。set-variable=wait_timeout=31536000 set-variable=interactive_timeout=31536000 问题得到了解决 想了深入解一下mysql的工作原理 百度了一下Google发现很多人都出现过这种问题,大多是配置hibernate时候出的问题,可惜我的项目中没有使用到hibernate只是简单的自己配了一个连接池,所以综合了问题的关键所在改了一下数据库配置,在这里暂且记录一下,以后备用。 Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在。 最近碰到了这个问题,检查后发现数据库连接池中保存的连接超时后失效了,下面是官方的解释 mysql gone-away 从Mysql 5.x的某个版本之后,MySQL的自动关闭空闲连接的特性被修改了,假如一个连接空闲到超时时间(默认28000秒8小时),再次发起的Reconnect重新连接请求不会被接受,需要重新建立新连接,这就导致了SER的重连机制不能正常工作:SER只会在需要操作数据库时去使用同一个连接接口,断开了则发起重新连接请求,而且这个问题短期内SER也不能够解决。 下文中将具体讲述处理的方法: 1.使用Mysql 4.0或4.1版本,如果没有用到Mysql 5的一些新特性比如存储过程触发器之类。 2.定时重启Mysql服务器或Ser(由于本问题可能同样会影响到其它一些需要Mysql支持的服务器程序,所以重启Mysql服务器为好,但需要检测Mysql服务器不被使用的一个时间重启比较难确定) 3.设置my.cnf,有mysqld字段内增加参数: [mysqld]port = 3306socket = /tmp/mysql.sockwait_timeout= 500000interactive_timeout = 500000(500000秒约五六天的超时时间,可根据实际需要选择一个数据库可能空闲的最长时间稍大的时间值。)重启Mysqld应用即可,也可以在执行mysqld时加-o wait_timeout=500000参数同样效果。 在MySQL客户端show variable时应该可以看到最后一条从默认的wait_time=28000变成500000了。 (假如重启Mysqld不生效,可以重启机子)
”;die();} echo “数据库服务器连接成功!
”;?> //将connect.php部署在已开启的WAMP平台环境中,并在浏览器地址中输入“http://localhost/connect.php”
”;echo “使用函数mysql_pconnect()永久连接数据库。
”;?>
”;die();} echo “数据库选择成功!
” ?>(2)数据的添加、更新和删除操作,mysql_query(SQL语句[,connection]),insert、update、delete语句可置于函数mysql_query()中从而实现数据的添加、更新和删除操作.数据的添加
”);Mysql_query(“set names ’gbk’”);//设置中文字符集
”;else echo “客户信息添加失败!
”;?>
”);Mysql_query(“set names ’gbk’”);$sql=“update customers set cust_address=’广州市’”;$sql=$sql.“where cust_name=’李中华’”;if(mysql_query($sql,$con))echo “客户地址修改成功!
”;else echo “客户地址修改失败!
”;?>
”);Mysql_query(“set names ’gbk’”);$sql=“delete from customers”;$sql=$sql.“where cust_name=’李中华’”;if(mysql_query($sql,$con))echo(“客户信息删除成功!
”);else echo(“客户信息删除失败!
”);?>
”);Mysql_query(“set names ’gbk’”);$sql=“select cust_name from customers”;$sql=$sql.“where cust_id=916”;$result=mysql_query($sql,$con);if($result){ echo “客户查询成功!
”;$array=mysql_fetch_array($result,MYSQL_NUM);if($array){ echo “读取到客户信息!
”;echo “所要查询客户的姓名为:”.$array[0].“
”;} else echo “未读取到客户信息!
”;} else echo “客户查询失败!
”;?>
”);Mysql_query(“set names ’gbk’”);$sql=“select * from customers”;$sql=$sql.“where cust_sex=’F’”;$result=mysql_query($sql,$con);if($result){ echo “查询成功!
”;$num=mysql_num_rows($result);//如果结果为空,则为0行 echo “所要查询的女性客户人数为:”.$num.“位
”;} else echo “查询失败!
”;?>第五篇:MySQL数据库连接超时(Wait_timeout)问题总结