mysql命令

一、连接mysql
格式: mysql -h主机地址 -u用户名 -p用户密码
1、连接到本机上的MYSQL。
首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码.
如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>
2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
mysql -h110.110.110.110 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样)
3、退出MYSQL命令: exit (回车)
二、修改密码。
格式:mysqladmin -u用户名 -p旧密码 password 新密码
1、给root加个密码ab12。首先在DOS下进入目录mysql\bin,然后键入以下命令

mysqladmin -u root -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。 2、再将root的密码改为djg345。
mysqladmin -u root -p ab12 password djg345
三、增加新用户。 (注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符) 格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码” 1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL,然后键入以下命令:
grant select,insert,update,delete on *.* to [email=test1@”%]test1@”%[/email]” Identified by “abc”;
但增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见2。 2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机), 这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。
grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “abc”;
如果你不想test2有密码,可以再打一个命令将密码消掉。
grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “”;
下篇我是MYSQL中有关数据库方面的操作。注意:你必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。 一、操作技巧 1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。 也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。 2、你可以使用光标上下键调出以前的命令。 二、显示命令 1、显示当前数据库服务器中的数据库列表:
mysql> SHOW DATABASES;
注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。 2、显示数据库中的数据表: mysql> USE 库名;
mysql> SHOW TABLES;
3、显示数据表的结构:
mysql> DESCRIBE 表名;
显示某个表创建时的全部信息 : show create table table_name; 4、建立数据库:
mysql> CREATE DATABASE 库名;
5、建立数据表:
mysql> USE 库名;
mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));
6、删除数据库:
mysql> DROP DATABASE 库名;
删除时可先判断是否存在,写成 : drop database if exits db_name 7、删除数据表: mysql> DROP TABLE 表名; 8、将表中记录清空:
mysql> DELETE FROM 表名;
9、显示表中的记录:
mysql> SELECT * FROM 表名;
10、往表中插入记录: insert into [`数据库名`](进入库后则不写) . `表名` (要插入的栏目名, 要插入的栏目名, 要插入的栏目名,…….. ) VALUES ( '插入的值', '插入的值'…… )//注意要插入的值得类型 例如:insert into shiyan1 (日期,时间,压力,位移) values ('2012-12-12','00:00:00',300,400);//日期:表名称,date型;时间:表名称,time型;压力,位移: int型 10.1向表中插入数据,同时插入多条 例如:Insert Into users(id,nikename,password,address)values(1,'lyh1','1234',null),(10,'lyh22','4321','湖北武汉'),(null,'lyh333','5678','北京海淀'); 10.2插入当前时间 使用mysql自带的函数 curdate()返回日期型数据 'YYYY-MM-DD' now()返回日期时间型数据 'YYYY-MM-DD HH:MM:SS' insert into 表名(xxx_date , xxx_d atetime) values(curdate(),now()) 11、更新表中数据:
mysql-> UPDATE 表名 SET 字段名1=’a',字段名2=’b’ WHERE 字段名3=’c';
12、用文本方式将数据装入数据表中:
mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名;
select * into outfile 'd:/test.xls' from 表名;注释:把mysql的数据库这种的某个表中的数据导出到d:/test.xls中。 13、导入.sql文件命令:
mysql> USE 数据库名;
mysql> SOURCE d:/mysql.sql;
14、命令行修改root密码:
mysql> UPDATE mysql.user SET password=PASSWORD(’新密码’) WHERE User=’root’;
mysql> FLUSH PRIVILEGES;
15、显示use的数据库名:
mysql> SELECT DATABASE();
16、显示当前的user:
mysql> SELECT USER();
17. 进行多表查询,选择users表中ID=10的用户发布的所有留言及该用户的所有信息
select articles.id,articles.content,users.* from users,articles where users.id=10 and articles.userid=users.id order by articles.id desc;
18. 同表查询,已知一个条件的情况下.查询ID号大于用户lyh1的ID号的所有用户
select a.id,a.nikename,a.address from users a,users b where b.nikename='lyh1' and a.id>b.id;
------也可写成
select id,nikename,address from users where id>(select id from users where nikename='lyh1');
19. 显示年龄比领导还大的员工:
select a.name from users a,users b where a.managerid=b.id and a.age>b.age;
20.查询编号为2的发帖人: 先查articles表,得到发帖人的编号,再根据编号查users得到的用户名。 接着用关联查询. select * from articles,users得到笛卡儿积,再加order by articles.id以便观察 使用select * from articles,users where articles.id=2 筛选出2号帖子与每个用户的组合记录 再使用select * from articles,users where articles.id=2 and articles.userid=users.id选出users.id 等于2号帖的发帖人id的记录. 只取用户名:select user where user.id=(select userid from articles where article.id =2) 21.找出年龄比小王还大的人:假设小王是28岁,先想找出年龄大于28的人
select * from users where age>(select age from users where name='xiaowang');
*****要查询的记录需要参照表里面的其他记录:
select a.name from users a,users b where b.name='xiaowang' and a.age>b.age
表里的每个用户都想pk一下.select a.nickname,b.nickname from users a,users b where a.id>b.id ; 更保险的语句:select a.nickname,b.nickname from (select * from users order by id) a,(se
lect * from users order by id) b where a.id>b.id ;
22.再查询某个人发的所有帖子.
select b.* from articles a , articles b where a.id=2 and a.userid=b.userid
说明: 表之间存在着关系,ER概念的解释,用access中的示例数据库演示表之间的关系.只有innodb引擎才支持foreign key,mysql的任何引擎目前都不支持check约束。 23 根据两个条件排序
select * from shiyan1 ORDER BY 日期 desc,时间 desc;
//更新(修改)表中数据; update `数据库` . `数据表` SET `字段` = '新值', `字段` = '新值',`字段` = '新值'……….
         where `数据表`.`主键` =主键的值 LIMIT 1 ; 
01://修改一个这样的一行数据; //数据库:db_liuyan //数据表:liuyan //相应字段:
           Lid:     //原值:5; 主键; 
           Name:     //原值:小张; 
           Conment: //原值:这个是小张; 
//这里更新:namet和Conment,Lid不变;
           update `db_liuyan`. `liuyan` set `Name` = '张', `Conment` = '小张就是这个人' //最后这没有豆号; 
           where `liuyan` . `Lid`=5 LIMIT 1; 
           //limit 1:只返回一条数据,避免全表扫描; 
//删除表中数据;
delete from `表名` where 查询条件; 
01: //删除表:test table中字段:Field下值为addtime的行;
       delete from `testtable` where `Field` = 'addtime' 
02: //删除表:test中Ccolumn字段值为’good’ //或者second字段的值为’long’的记录:
       delete from `test` where `Ccolumn`='good' or `second`='long'; 
03: //删除表中id=29的记录;
       delete from `test` where `id`='29' limit=1; 
//查询表中数据; select `字段名`,`字段名` from `表名` [where 条件] 01: //查询testtable表中姓名为“张三”的nickname字段和email字段
       select `nickname`,`email` from `testtable` where `name`='张三'; 
02: //查询testtable表中nickname字段所有内容
       select `nickname` from `testtable`; //更多栏写多个字段名; 
03: //查询testtable表中nickname字段所有内容,并以表格形式打印;
       select DISTINCT `nickname` from `testtable`; 
//拷贝表操作; 01: //拷贝整个表到另外一个表
       insert * into 新表名 from 原表名; 
02: //拷贝字段sssecond的值等于’Copy!’的记录的fffirst字段; SELECT `fffirst` INTO `新表名`
       FROM `mytable` 
       WHERE `sssecond`='Copy!';
三、一个建库和建表以及插入数据的实例 drop database if exists school; //如果存在SCHOOL则删除 create database school; //建立库SCHOOL use school; //打开库SCHOOL create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default ‘深圳’,
year date
); //建表结束 //以下为插入字段
insert into teacher values(”,’allen’,'大连一中’,'1976-10-10′);
insert into teacher values(”,’jack’,'大连二中’,'1975-12-23′);
如果你在mysql提示符键入上面的命令也可以,但不方便调试。 (1)你可以将以上命令原样写入一个文本文件中,假设为school.sql,然后复制到c:\\下,并在DOS状态进入目录[url=file://\\mysql\\bin]\\mysql\\bin[/url],然后键入以下命令: mysql -uroot -p密码 < c:\\school.sql 如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。 (2)或者进入命令行后使用 mysql> source c:\\school.sql; 也可以将school.sql文件导入数据库中。 四、将文本数据转到数据库中 1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用[url=file://\\n]\\n[/url]来代替.例: 3 rose 大连二中 1976-10-10 4 mike 大连一中 1975-12-23 假设你把这两组数据存为school.txt文件,放在c盘根目录下。 2、数据传入命令 load data local infile “c:\\school.txt” into table 表名; 注意:你最好将文件复制到[url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下,并且要先用use命令打表所在的库。 五、备份数据库:(命令在DOS的[url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下执行) 1.导出整个数据库 导出文件默认是存在mysql\bin目录下 mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql
2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
3.导出一个数据库结构 mysqldump -u user_name -p -d ?add-drop-table database_name > outfile_name.sql -d 没有数据 ?add-drop-table 在每个create语句之前增加一个drop table 4.带语言参数导出 mysqldump -uroot -p ?default-character-set=latin1 ?set-charset=gbk ?skip-opt database_name > outfile_name.sql

5.在mysql命令下使用:“select * into outfile 'd:/test.xls' from 表名”命令把mysql的数据库这种的某个表中的数据导出到d:/test.xls中。

  1. SELECT * FROM shiyan1 order by 时间 desc; 降序
  2. SELECT * FROM shiyan1 order by 时间 asc; 升序
  3. mysql中如何自动删除数据表中的数据
    会员注册后,如果一个月未登录该帐号,则所注册的帐号系统自动删除。这个功能mysql实现:mysql有自己的定时任务机制。
CREATE EVENT `e_call` ON SCHEDULE EVERY 10 SECOND STARTS '2009-06-25 15:21:54' ON COMPLETION NOT PRESERVE ENABLE DO call p_chk();
定时,每10秒执行一下p_chk存储过程。 9. mysql 从多个表中删除 有a,b,c,d 4个表,现在想删除4表中字段key值为value的所有数据,怎么一句实现.
delete
from a,b,c,d
using a,b,c,d
where a.key='value' || b.key='value' || c.key = 'value' || d.key = 'value' 
上面是只要任意表的key字段为value的时候就删除该记录,如果是要求四个表key字段同时为value的时候就需要把 || 改成 && 如果是删除全部数据,就delete from 表名字 如果根据条件删除,就这样:delete from 表名字 where ... delete from shiyan1 where 时间<’14:49:00’
  1. mysql中删除表中的第n行到第m行的数据
    delete from 表名 where id>n-1 and id<m+1
    mysql 删除某字段相同的记录
    delete from 表名 a where 字段1,字段2 in(select 字段1,字段2,count() from 表名 group by 字段1,字段2 having count() > 1)
    上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。
delete from表名where id not in (select id from table group by column A);
delete from shiyan1 where 日期 is null// 11.删除时间最靠前的n条记录 delete from表名order by time limit n //time 为time类型的字段 MySQL字段的常用语句 1、创建表格时添加自增字段: create table table1(id int auto_increment primary key,...) 2、创建表格后添加自增字段: alter table table1 add id int auto_increment primary key 自增字段,一定要设置为primary key. 附:mysql 中的alter table mysql> alter table employee change depno depno int(5) not null; 加索引 mysql> alter table 表名 add index 索引名 (字段名1[,字段名2 …]); 例子: mysql> alter table employee add index emp_name (name); 加主关键字的索引 mysql> alter table 表名 add primary key (字段名); 例子: mysql> alter table employee add primary key(id); 加唯一限制条件的索引 mysql> alter table 表名 add unique 索引名 (字段名); 例子: mysql> alter table employee add unique emp_name2(cardnumber); 查看某个表的索引 mysql> show index from 表名; 例子: mysql> show index from employee; 删除某个索引 mysql> alter table 表名 drop index 索引名; 例子: mysql>alter table employee drop index emp_name; 修改表:增加字段:mysql> ALTER TABLE 表名ADD 新字段名 类型; 查看表:mysql> SELECT * FROM 表名; 修改原字段名称及类型:mysql> ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型; 删除字段:ALTER TABLE表名DROP 字段名; 增加字段:
        ALTER TABLE 表名 ADD 字段名 类型;
alter table table_name add 字段名 字段类型 after 某字段; 重命名表
       alter table t1 rename t2;
调整字段顺序:
ALTER TABLE `user_movement_log` CHANGE `GatewayId` `GatewayId` int not null default 0 AFTER RegionID
1) 选择表中前N行数据: select * from 表名 limit N(N=行数) 2) 根据某种条件进行选择(函数where) select 列名1, 列名2 from 表名 where条件1 and/ or 条件2 例子:select 压力 from shiyan1 where 压力=479 //压力为int型 3) 计算某种条件的行数 select count(列名) from 表名 where 条件1 and/ or 条件2 例子:select count(压力) from shiyan1 where 压力=479 //返回的是压力=479的行的总数 4) Excel的透视表作用 Select 列名1,列名2,… count (列名3) from 表名 where 条件 group by 列名1,列名2,… Eg. 如查看各zone(片区)下各type1(品牌)total(arpu)高于50元的用户数
select zone,type1,count(number) from use_201009 where total>=50 group by zone,type1
5) 导出表格 Select 列名1,列名2,… count (列名3) as 列名N into 表名2 from 表名1 where 条件 group by 列名1,列名2,…
e.g select zone,type1,count(number) as b into xyz from use_201009 where total>=50 group by zone,type1
注:as b 的意思是为count(number)列进行列命名 6) 查找A表中与B表中number相同的数据 Select 列名 from 表1 where 列名 in (select 列名 from 表2 where 条件1) and 条件2
e.g. select number from a where number in (select number from b where total>50) and total>50
mysql查询最新插入的十条记录怎么查询 先把数据库的字段贴出来。数据库中一般都会有个主键id字段,SQL语句:
select * from shiyan1 order by ID desc limit 10;
9 . 查询 : 查询所有数据 : select * from table_name; 查询指定字段的数据 : select 字段1 , 字段2 from table_name; 例 : select id,username from mytable where id=1 order by desc; 10 . 更新指定数据 , 更新某一个字段的数据(注意,不是更新字段的名字) Update table_name set 字段名=’新值’ [, 字段2 =’新值’ , …..][where id=id_num] [order by 字段 顺序] 例 : update mytable set username=’lisi’ where id=1; Order语句是查询的顺序 , 如 : order by id desc(或asc) , 顺序有两种 : desc倒序(100—1,即从最新数据往后查询) ,asc(从1-100),Where和order语句也可用于查询select 与删除delete 11 . 删除表中的信息 : 删除整个表中的信息 : delete from table_name; 删除表中指定条件的语句 : delete from table_name where 条件语句 ; 条件语句如 : id=3; 12 . 创建数据库用户 一次可以创建多个数据库用户如: CREATE USER username1 identified BY ‘password’ , username2 IDENTIFIED BY ‘password’…. 13 . 用户的权限控制:grant 库,表级的权限控制 : 将某个库中的某个表的控制权赋予某个用户
Grant all ON db_name.table_name TO user_name [ indentified by ‘password’ ];
14.一次性清空表中的所有数据 truncate table table_name; 此方法也会使表中的取号器(ID)从1开始 15.获得新插入的Id值(此id是自增字段) SELECT LAST_INSERT_ID()可以获得刚刚插入的自增。 Mysql创建自增主键问题 关键字: mysql创建自增主键 由于用习惯了sqlserver 对Mysql的主键问题不是习惯 经研究发现其结构如下:
drop table if exists `state`; 
create table state 
( 
  sid int not null primary key auto_increment, 
  sname varchar(20) not null 
)engine=innodb; 
insert into state values(0,'管理员'); 
insert into state values(0,'vip会员'); 
insert into state values(0,'会员'); 
insert into state values(0,'普通用户'); 
select * from state 
定时每天备份mysql并定时删除上月记录(脚本) shell脚本: 备份的脚本比较简单:
#!/bin/bash
# 定义年 月 日
year=`date   +%Y`
month=`date   +%m`
day=`date   +%d`
# 定义备份的目录
BACKDIR=/bak_1/mysql/$year/$month/$day
# MySQL的root密码
ROOTPASS=123456
# 建立目录
mkdir -p $BACKDIR
# 获取数据库列表
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /`
# 备份
for dbname in $DBLIST
do
mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy
done 
复制代码 上面的脚本将数据库按"年/月/日"目录结构备份,将脚本存为back.sh添加到cron里每天凌晨3点执行
00 03 * * * root /root/back.sh
下面的是每月3号删除上个月的备份,存为del_bak.sh,每月3号3点3分执行
03 03 03 * * root /root/del_bak.sh
注意脚本上传后,要chmod一下权限,比如chmod 755 /root/back.sh
#!/bin/bash
# 定义年 月 日
year=`date   +%Y`
month=`date   +%m`
#day=`date   +%d`
# 取上一个月
month=`expr $month - 1` 
# 如果是1月,则上一月为12,并且年也减1
  if [ $month -eq 0 ]; then
     month=12
     day=31
     year=`expr $year - 1` 
  fi
# 因为备份时小于10月的月份有前导零,所以这里判断如果小于10月,则加前导零
  if [ $month -lt 10 ]; then
     pre=0 
   fi
#获取要删除的目录名
BACKDIR=/bak1/mysql/$year/$pre$month
#删除了
rm -rf $BACKDIR
MySQL从5.1开始支持event功能,有了这个功能之后我们就可以让MySQL自动的执行数据汇总等功能,   创建测试表 注意:在使用定时器时,一定先查看定时器的状态:show variables like '%sche%';   create table t 开启定时器 0:off ,1:on,若定时器为关闭,则定时作用无效;   ( varchar(100) not null set global event_scheduler = 1;设置定时器的开启状态   ) engine innodb default charset=utf8;   创建定时器调用的存储过程   delimiter $$   drop procedure if exists e_test $$   create procedure e_test()   begin   insert into t values('1');   end $$   delimiter ;   要使定时起作用 mysql的常量global event_scheduler必须为on或者是1   -- 查看是否开启定时器   show variables like '%sche%';   -- 开启定时器 0:off 1:on   set global event_scheduler = 1;   -- 创建事件   --每隔一秒自动调用e_test()存储过程   create event if not exists event_test   on schedule every 1 second   on completion preserve   do call e_test();   -- 开启事件   alter event event_test on   completion preserve enable;   -- 关闭事件   alter event event_test on   completion preserve disable;   select * from t;   例子:   1.从现在开始每隔九天定时执行   create event event1   on schedule every 9 day starts now()   on completion preserve enable   do   begin   call total();   end   2.每个月的一号凌晨1 点执行   create event event2   on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day), interval 1 month),interval 1 hour)   on completion preserve enable   do   begin   call stat();   end   3.每个季度一号的凌晨2点执行   create event total_season_event   on schedule every 1 quarter starts date_add(date_add(date( concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 2 hour)   on completion preserve enable   do   begin   call season_stat();   end   4.每年1月1号凌晨四点执行   create event total_year_event   on schedule every 1 year starts date_add(date(concat(year(curdate()) + 1,'-',1,'-',1)),interval 4 hour)   on completion preserve enable   do   begin   call year_stat();   end   MySQL的event和Oralce的Job还是有点不同的,这点让笔者比较困扰在进行按月,季,年进行自动调用存储过程 时,为了测试可以 把系统改为年的最后一天,如2010-12-31 23:59:55;这个Oracle的Job就会把月,季,年存储过程执行一遍。但MySQL改了系统时间了Event也没有定时执行。不知道各位大虾有没有什么好办法?可以解决这个问题。 mysql 5.1 创建事件 创建事件(create event) 先来看一下它的语法:
Create event [if not exists] event_name
    on schedule schedule
    [on completion [not] preserve]  
    [enable | disable] 
    [comment 'comment'] 
do sql_statement;
//注释
schedule:
 at timestamp [+ interval interval]| every interval [starts timestamp] [ends timestamp]
interval:
quantity {year | quarter | month | day | hour | minute |week | second | year_month | day_hour | day_minute |day_second | hour_minute | hour_second | minute_second}
[on completion [not] preserve]可以设置这个事件是执行一次还是持久执行,默认为not preserve。 [enable | disable]可以设置该事件创建后状态是否开启或关闭,默认为enable。 [comment 'comment']可以给该事件加上注释 //注释 1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表
use test;
create table aaa (timeline timestamp);
create event e_test_insert
on schedule every 1 second 
do insert into test.aaa values (current_timestamp);
等待3秒钟后,再执行查询看看:
mysql> SELECT * FROM aaa;
+---------------------+ 
| timeline            | 
+---------------------+ 
| 2007-07-18 20:44:26 | 
| 2007-07-18 20:44:27 | 
| 2007-07-18 20:44:28 | 
+---------------------+
2) 5天后清空test表:
create event e_test
on schedule at current_timestamp + interval 5 day
do truncate table test.aaa; //注释:truncate table:删除表中的所有记录;语法:truncate table tablename 3) 2007年7月20日12点整清空test表:
create event e_test
on schedule at timestamp '2007-07-20 12:00:00'
do truncate table test.aaa;
4) 每天定时清空test表:
create event e_test
on schedule every 1 day
do truncate table test.aaa;
5) 5天后开启每天定时清空test表:
create event e_test
on schedule every 1 day
starts current_timestamp + interval 5 day
do truncate table test.aaa;
6) 每天定时清空test表,5天后停止执行:
create event e_test
on schedule every 1 day
ends current_timestamp + interval 5 day
do truncate table test.aaa;
7) 5天后开启每天定时清空test表,一个月后停止执行:
create event e_test
on schedule every 1 day
starts current_timestamp + interval 5 day
ends current_timestamp + interval 1 month
do truncate table test.aaa;
[on completion [not] preserve]可以设置这个事件是执行一次还是持久执行,默认为not preserve。 8) 每天定时清空test表(只执行一次,任务完成后就终止该事件):
create event e_test
on schedule every 1 day
on completion not preserve
do truncate table test.aaa;
[enable | disable]可是设置该事件创建后状态是否开启或关闭,默认为enable。 [comment ‘comment’]可以给该事件加上注释。 三、修改事件(alter event)
alter event event_name
    [on schedule schedule]
    [rename to new_event_name]
    [on completion [not] preserve]
    [comment 'comment']
    [enable | disable]
    [do sql_statement]
1) 临时关闭事件
alter event e_test disable;
2) 开启事件
alter event e_test enable;
3) 将每天清空test表改为5天清空一次:
alter event e_test
on schedule every 5 day;
四、删除事件(drop event) 语法很简单,如下所示:
drop event [if exists] event_name
例如删除前面创建的e_test事件
drop event e_test;
当然前提是这个事件存在,否则会产生error 1513 (hy000): unknown event错误,因此最好加上if exists
drop event if exists e_test;
mysql中删除表记录delete from和truncate table的用法区别: MySQL中有两种删除表中记录的方法: (1)delete from语句,(2)truncate table语句。 delete from语句可以使用where对要删除的记录进行选择。delete语句更灵活。 truncate table将删除表中的所有记录。 情况一:清空表中的所有记录,可以使用下面的两种方法:
delete from tablename 
truncate table tablename 
其中第二条记录中的table是可选的。 情况二:删除表中的部分记录,只能使用delete语句。
delete FROM table1 WHERE ;
区别: (1)如果delete不加WHERE子句,那么它和truncate table是一样的,但它们有一点不同,那就是delete可以返回被删除的记录数,而truncate table返回的是0。 (2)如果一个表中有自增字段,使用truncate table和没有WHERE子句的delete删除所有记录后,这个自增字段将起始值恢复成1.如果你不想这样做的话,可以在delete语句中加上永真的WHERE,如WHERE 1或WHERE true。
delete FROM table1 WHERE 1;
上面的语句在执行时将扫描每一条记录。但它并不比较,因为这个WHERE条件永远为true。这样做虽然可以保持自增的最大值,但由于它是扫描了所有的记录,因此,它的执行成本要比没有WHERE子句的delete大得多。 (3)还有一点就是,如果要删除表中的所有数据,建议使用truncate table, 尤其是表中有大量的数据, 使用truncate table是将表结构重新建一次速度要比使用delete from快很多,而delete from是一行一行的删除,速度很慢. (4)Truncate 是整体删除, delete是逐条删除(5)truncate不写服务器log,delete写服务器log,这就是为什么truncate要快过delete 所以,影响有:(1)truncate 快;(2)truncate不激活 trigger;(3)truncate 重置 Identity 总结: 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; 例子:数据库用truncate table清空表 一共三个表,表A表B表C,表A中的a列是表B的外键,和表B的a列关联;表B中的b1列是表C的外键,和表C的b列关联 我现在要做的操作是:(1)删除AB间的参照关系(2)清空A表(3)给A表重新赋值(4)加上AB之间的参照性 用的语句分别是
ALTER TABLE B drop constraint a_fkey;
truncate table A;
insert……
ALTER TABLE B add constraint a_fkey foreign key (a) references A(a);
但是在执行到truncate时提示
ERROR:  cannot truncate a table referenced in a foreign key constraint
DETAIL:  Table "B" references "A".
HINT:  Truncate table "B" at the same time, or use TRUNCATE ... CASCADE.
解决方法 最佳答案 你可以先删除外键,或者disable外键,然后TRUNCATE TABLE,之后再重建或者enable外键。

MySQL 触发器
create trigger <触发器名称>

      { before | after }
      { insert | update | delete }
on <表名称>
      for each row
<触发器sql语句> 规则: 1.触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. 2.我们不能给同一张表的同一个事件安排两个触发器 3.FOR EACH ROW子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。 4.你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER)。 5.触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句,包括复合语句,但是这里的语句受的限制和函数的一样:
         alter 'cache index' call commit create delete
         drop 'flush privileges' grant insert kill
         lock optimize repair replace revoke
         rollback savepoint 'select from table'
         'set system variable' 'set transaction'
         show 'start transaction' truncate update
MYSQL创建触发器 语法:create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stmt

trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。
trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

·INSERT:将新行插入表时激活触发程序,例如,通过insert、load data和replace语句。
·UPDATE:更改某一行时激活触发程序,例如,通过update语句。
·DELETE:从表中删除某一行时激活触发程序,例如,通过delete和replace语句。
请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于insert的before触发程序不仅能被insert语句激活,也能被load data语句激活。
可能会造成混淆的例子之一是insert into .. on duplicate update ...语法:before insert触发程序对于每一行将激活,后跟after insert触发程序,或before update和after update触发程序,具体情况取决于行上是否有重复键。
注意:
对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。
例如,对于某一表,不能有两个before update触发程序。但可以有1个before update触发程序和1个before insert触发程序,或1个before update触发程序和1个after update触发程序。

trigger_stmt是当触发程序激活时执行的语句。如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。这样,就能使用存储子程序中允许的相同语句。

示例:

CREATE TRIGGER update_blogs after insert  on blogs  for each row
update blogcategory SET amount = amount + 1 WHERE cid = new.categoryid;
该语句创建了一个名为update_blogs的触发程序,这个触发程序在blogs表发生insert、load data和replace语句时执行“UPDATE blogcategory SET amount = amount + 1 WHERE cid = NEW.categoryid;” 2.一般情况下对mysql中变量的赋值用set 。
Create Trigger Insert_or_update_sal before update on teacher 
for each row 
Begin if    new.sal < 4000 then set new.sal=4000; 
end if; 
end;
//
b(BEFORE):标识是触发事件之前, a(AFTER):标识触发事件之后, i(insert): 标识insert事件, u(update):标识update事件,
d(delete):标识delete事件;
㈢使用触发程序 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。在某些触发程序的用法中,可用于检查插入到表中的值,或对更新涉及的值进行计算。 触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。可以将触发程序设置为在执行语句之前或之后激活。例如,可以在从表中删除每一行之前,或在更新了每一行后激活触发程序。要想创建触发程序或舍弃触发程序,可使用CREATE TRIGGER或DROP TRIGGER语句 ·触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL(允许存储程序通过参数将数据返回触发程序)。 ·触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、COMMIT或ROLLBACK。 通过使用BEGIN ... END结构,能够定义执行多条语句的触发程序。在BEGIN块中,还能使用存储子程序中允许的其他语法,如条件和循环等。但是,正如存储子程序那样,定义执行多条语句的触发程序时,如果使用mysql程序来输入触发程序,需要重新定义语句分隔符,以便能够在触发程序定义中使用字符“;”。在下面的示例中,演示了这些要点。在该示例中,定义了1个UPDATE触发程序,用于检查更新每一行时将使用的新值,并更改值,使之位于0~100的范围内。它必须是BEFORE触发程序,这是因为,需要在将值用于更新行之前对其进行检查:
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
    -> FOR EACH ROW
    -> BEGIN
    ->IF NEW.amount < 0 THEN
    ->     SET NEW.amount = 0;
    ->     ELSEIF NEW.amount > 100 THEN
    ->     SET NEW.amount = 100;
    ->     END IF;
    -> END;//
mysql> delimiter ;
较为简单的方法是,单独定义存储程序,然后使用简单的CALL语句从触发程序调用存储程序,如果你打算从数个触发程序内部调用相同的子程序,该方法也很有帮助。 例一:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
    -> FOR EACH ROW SET @sum = @sum + NEW.amount;
6.可以使用NEW与OLD关键字来访问更新前后的数据用触发器编写加密 aes_encryp加密函数
      mysql> delimiter // 
      mysql> create triggert_customer_insert before insert on customer
          -> for each row
          -> begin 
          -> set NEW.customer_ssn = aes_encrypt(NEW.customer_ssn,'password');
          -> end; 
          -> //
      Query OK, 0 rows affected (0.00 sec)
      mysql> delimiter ;
      mysql> insert into customer values (1,'fred','smith','456097234');
      Query OK, 1 row affected (0.00 sec)
      mysql> select * from customer;
用触发器更新记录字段的长度char_length()函数
      mysql> create table data (name varchar(255)); 
      query ok, 0 rows affected (0.09 sec)
      mysql> create table chars (count int(10));
      query ok, 0 rows affected (0.07 sec)
      mysql> insert into chars (count) values (0);
      query ok, 1 row affected (0.00 sec)
      mysql> create trigger t1 after insert on
      data for each row update chars set count 
      = count + char_length(new.name);
      query ok, 0 rows affected (0.01 sec)
相反的
      create trigger t2 
      after delete on data
      for each row 
      begin
      update chars set count = count - char_length(old.name);
      end;
      //
mysql触发器如何在关联的两个表都建触发器 如果a表跟b表中都有用户名、密码。我要改a表时在a表建触发器改b表,修改b表时也在b表建个触发器改a表,a表的触发器我已经建好了。请问再给b表建触发器的时候是不是要判断一下什么,要不然就报错了 如果你想通过2个表的触发器来实现"用户名、密码"的更新的数据同步,则是不可以的. 建议改变逻辑处理:写一个共用的存储过程,然后在存储过程里同时实现2个表的数据更改即可.