兴海北路

---男儿仗剑自横行
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

  • 随笔 - 85
  • 文章 - 0
  • 评论 - 17
  • 引用 - 0

常用链接

留言簿(6)

随笔分类

随笔档案

收藏夹

全是知识啊

搜索

  •  

最新评论

阅读排行榜

评论排行榜

鸟哥学习Shell Scripts

     摘要: 引用:    学习Shell Scripts    如果您真得很想要走信息这条路,并且想要好好的管理好属于您的主机,那么,别说鸟哥不告诉您,Shell Scripts真的是必须要学习的一项课程!基本上,Shell scripts有点像是早期的批处理文件,亦即是将一些指令汇编起来一次执行,但是Shell scripts拥有更强大的功能,那就...  阅读全文

posted @ 2008-03-16 18:40 随意门 阅读(490) | 评论 (0)编辑 收藏
如何把Access中数据导入Mysql中[手工]

作者: falcon   发表日期: 2006-04-12 18:31   复制链接



版权声明:该文为本人原创,可以自由转载,但不得用于商业途径,并且需保留原作者名和本站地址.

参考资料:
1)mysql入门:http://space.lzu.edu.cn/homeof/usmot/bbs/show.asp?id=85
2)mysql数据类型:http://blog.xinweb.org/?action=show&id=20
3)mysql中文手册:http://www.linuxforum.net/books/mysqlmanual/manual_toc.html
4)mysql导入导出:http://it.yn.cninfo.net/pubnews/doc/read/8742421943220786691/103.oldsystem14.2635/index.asp

背景说明:

由于要做ftp搜索引擎的新版,即把目前VB+ACCESS+ASP的版本转换成C+Mysql+PHP版

打算WEB开发和底层开发同时进行

所以得先想办法把Access中的数据转到Mysql中

那么如何实现呢?

转入正题
下面,一步一个脚印开始把Access数据转换成Mysql的哦

第一步:

根据Access中数据库的逻辑结构[或者是以前写好的数据库设计文档哦]
在Mysql下设计并创建出对应的数据库

先看看Access中的几个表的结构,并进行初步的数据类型转换哦
site_tab //站点信息表

字段名称     数据类型(Access)     数据类型(Mysql)
id     数字     int
site     文本     char(15)
port     数字     int
user     文本     char(15)
pw     文本     char(15)
acc     是/否     enum('N','Y')
indb     是/否     enum('N','Y')
info     备注     text

key_tab //关键字统计表

key     文本     char(100)
acctime     数字     int


file_tab //文件表

file     Text(100)     char(100)
postfix     Text(4)     char(4)
pid     Integer     int
ipid     Integer     int
acctime     long     int

cat_tab //目录表

id     Integer     int
cat     Text(100)     char(100)
postfix     Text(4)     char(1) //这个可以考虑删除掉,因为多余
pid     Integer     int
ipid     Integer     int
acctime     long     int

下面根据上面的转换,创建mysql下的数据库和对应的表项
[注意:上面涉及到的Mysql的数据类型可能选择地不够合适,需要日后调整]

先创建库,取名为falcon_search
create database falcon_search;

创建表site_tab
create table site_tab
(
id   int   not null primary key,
site   char(15)   not null,
port   int   default 21,
user   char(15)   not null   default 'anonymous',
pw   char(15)   not null   default 'falcon',
acc   enum('N','Y')   default 'N',
indb   enum('N','Y')   default 'N',
info   text
);

创建表key_tab
create table key_tab
(
skey   char(100) binary not null unique ,
acctime   int default 0
);

创建表cat_tab
create table cat_tab
(
id   int,
cat   char(100) binary not null,
postfix   char(1) binary,
pid   int references cat_tab(id),
ipid   int references site_tab(id),
acctime   int,
primary key(id,ipid)
);

创建文件表file_tab
create table file_tab
(
file   char(100) binary not null,
postfix   char(4) binary   not null,
pid   int references cat_tab(id),
ipid   int references site_tab(id),
acctime   int
);
//由于文件重名的情况比较多,所以无须设置主关键字
第二步:

数据库和表都创建好拉,我们现在得想办法把数据从Access弄到Mysql下
怎么弄呢?

1)先把Access中的数据导出为txt文件[文本文件]
具体办法:打开要操作的Access数据库后,选择"文件">>导出>>文本文件
在选择导出后会弹出一个窗口,我们通过单击"高级"设置其中的字段分割符为{tab},文本识别符号改成{无},当然还可以进行其他的设置哦.
注意:对应的各个文件的文件名取名为对应的表名哦(统一一下,方便后面操作)


2)之后,复制到mysql下的bin所在目录下

第三步:

设法把文本文件中的数据导入到刚才创建的表中,要对应起来哦

主要用到该句:LOAD DATA LOCAL IN FILE 存有数据的文本文件名 INTO TABLE 表名;

下面我们通过该办法一个一个地把数据从文本文件中导入对应的表中

1)site_tab.txt===>site_tab
load data local infile "site_tab.txt" into table site_tab;

ok,成功拉,不过好象有警告哦

我们先用select * site_tab;看看
原来,acc和indb全为空的

现在我们只要把acc和indb的值更新为'N'就可以拉:
update site_tab set indb="N";
update site_tab set acc="N";

2)key_tab.txt===>key_tab

load data local infile "key_tab.txt" into table key_tab;

3)cat_tab.txt===>cat_tab

load data local infile "cat_tab.txt" into table cat_tab;

4)file_tab.txt===>file_tab

load data local infile "file_tab.txt" into table file_tab;


呵呵,ok,我们成功的把数据从Access导入到Mysql里头拉
其实我们完全可以把这些操作更简化一些,有时间再弄,呵呵

兄弟姐妹们还有什么好的简单办法,不妨到后面跟贴哦

关于把文本文件里头的数据转入postgresql中:

Quote:

将SQLSERVER的数据导入到postgresql中
在linux 的实际应用过程中,经常要处理一些数据的导入及导出 ,特别是将windows平台的数据导到linux平台的数据库中. 从网上的一篇“如何把ACCESS的数据导入到Mysql中”文中,我获得了一些启示,成功的将sqlserver数据导到了postgresql数据库 中。
实现手段如下:
postgresql有一个非常有用的sql命令COPY — 在表和文件之间拷贝数据 ,
语法
COPY [ BINARY ] table [ WITH OIDS ]
FROM { filename | stdin }
[ [USING] DELIMITERS delimiter ]
[ WITH NULL AS ull string ]
COPY [ BINARY ] table [ WITH OIDS ]
TO { filename | stdout }
[ [USING] DELIMITERS delimiter ]
[ WITH NULL AS ull string ]
详细请参见postgresql7.1.1 document中文版(http://laser.zhengmai.com.cn/pgsqldoc-7.0c/sql-copy.htm)说明。
首 先我们把数据从sqlserver中导出为文本文件.在导出过程中注意选择好字段分隔符和文本标识符,且查看一下文本文件,确定一个记录是否在同一行上, 如不是,则手工把回车键除掉.假如我们导出的文本文件为c:\friend.txt.把它拷贝到linux下 /usr/test/目录下。其内容如下:
1,云飞扬,男,南京六合,徐州建院
2,孙高勇,男,南京六合,徐州建院
3,朱晓玲,女,南京,未知
我们要将数据从linux文件复制到表friends(表的结构要同文本文件的格式一致字段如下:id,name,sex,address,school),使
用“,”字符作为分隔线:
copy friends FROM /usr/test/friend.txt USING DELIMITERS ',';
去试一下(注意转义字符),是不是一切ok!
当然拉,这种方法还是比较麻烦地,不知各位还有什么更好的方法,请告诉我,我的email:yfy002@21cn.com

参考文档:1.如何把ACCESS的数据导入到Mysql中
2.postgresql7.1.1 document中文版(http://laser.zhengmai.com.cn)



参考http://www.akae.cn/bbs/redirect.php?fid=24&tid=3584&goto=nextoldset

posted @ 2008-03-14 16:16 随意门 阅读(499) | 评论 (0)编辑 收藏
mysql模糊查询结果不准确的解决办法

作者: falcon   发表日期: 2006-04-15 16:07   复制链接



引言:

在执行mysql的模糊查询操作时,发现返回的结果不准确,可至今没有找到完善的解决方案,所以特地来寻求解决方案拉.

问题:


我在命令行里头直接使用mysql(版本为mysql-4.0.18-win.zip)的时候也出现同样问题:
===================================
我有一个表里头存放了一些文件信息,包括中文的非中文的;
表名为file_tab,里头的重要字段是file,存放文件名,另外该字段的类型是char

我想查找包含"新鲜"这个词语的所有文件
理所当然的就用了

select file from file_tab where file like '%新鲜%'

执行后返回的结果却包含了其他信息,如下:

李湘给我新鲜
凯瑞·路易斯·托马斯&克利斯·马顿-水晶头骨之谜
刘易斯·托马斯-水母与蜗牛
刘易斯·托马斯-细胞生命的礼赞
托马斯-细胞生命的礼赞
[刘易斯·托马斯] 科学的危险
[柳文扬] 托马斯叔叔的推荐信
08.新鲜

结果明显不符合我的本来用意

自己分析:有可能是mysql对中文的处理问题,也许其他文件名里头的信息对应字节信息和"新鲜"对应的字节信息存在匹配关系,所以才得到这样不符合本来要求的结果,可是我找不到解决办法.

后来我以为是mysql的版本太低,从贵站下了msyql5.0.18,可是输出结果同样不准确,所以无奈
麻烦大家一起探讨/

详细见:http://bbs.mysql.cn/thread-633-1-1.html



解决办法:

解决问题本身
如果你定义该字段类型为char型,请用alter添加约束binary;
针对我上面的问题,解决方案如下:

先用describe file_tab查看该表的数据结构,然后通过下面的语句进行修改

alter table file_tab modify file char(100) binary not null;

[注:其中char(100) not null为原来的类型或约束,binary为添加的约束]

补充,如果你定义的字段类型为其他类型,遇到类似问题,可能也是没有加binary的缘故,试试就知道,呵呵

不过到底还是不知道为什么要用binary哦
所以我有去网路上找了一下,在百度里头输入mysql binary

先是找到《mysql中文参考手册》(用编辑>查找>binary,看看其作用)
http://www.yesky.com/imagesnew/software/mysql/manual_Compatibility.html
里头介绍了binary的作用:

缺省地,所有的字符串比较是忽略大小写的,由当前的字符集决定了(缺省为ISO-8859-1 Latin1)排序顺序。如果你不喜欢这样,你应该用BINARY属性或使用BINARY强制符声明列,它导致根据MySQL服务器主机的ASCII顺序进行排序。

后来竟然找到和我问题一样的东东:
《MySQL中文模糊检索问题的解决方法》
http://down.dl.net.cn/Article.asp?id=605
我的天啊,竟然有这么详细的解决办法

解决附带问题,实现不区分大小写查询

但是仔细一看,用binary后,竟然区分大小写拉

因此在查找的时候很不方便

那么我们该怎么办呢?

上面的文章中提到了解决办法,但在文末尾提到了这样会影响一些速度
那怎么尽量消除这个解决办法带来的的速度的影响呢?

这样子:

我们在添加数据进入表之前把该字段的所有数据全部该成小写,然后在查询的时候把输入的关键字也转换成小写的,那么问题不是解决拉,呵呵

具体可以这么做:

update file_tab set file=lcase(file);

然后查询的时候,改成
我们先设传进来的参数为$filename
那么可以这么做:

select file from file_tab where file like '%lcase($filename)%'

到现在,问题基本上完善解决拉

posted @ 2008-03-14 16:14 随意门 阅读(1223) | 评论 (0)编辑 收藏
mysql数据库的备份与恢复详解

作者: falcon   发表日期: 2006-04-16 10:50   复制链接



引言:

数据对我们来说,往往非常重要,一旦丢失,将损失巨大,因此应该养成备份和恢复数据的习惯

正文:

对于mysql来说,常见的备份和恢复办法如下:

先通过命令行进入mysql的bin目录下,然后进行如下操作

备份:mysqldump 需要导出的数据库名 >想备份成的文件名 -u 用户名 -p

如我想用root用户导出一个名为falcon_search的数据库为一个falcon_search.mysql,那么我就可以这么做拉

Quote:

mysqldump falcon_search >falcon_search.mysql -u root -p


Enter password: ******
******输入你的root用户密码就可以拉

备份和恢复往往是孪生兄弟或姐妹
下面我们来恢复

恢复:mysqldump 需要导入为什么数据库名 <备份好的文件名 -u 用户名 -p

假如我要恢复刚才备份的数据库,那么我可以这么做
Quote:

mysqldump falcon_search <falcon_search.mysql -u root -p


Enter password: ******
******输入你的root用户密码就可以拉

到这里,我们发现mysql数据库的备份和恢复比较简单,是吧?
不过这种备份和恢复只能在mysql内部进行哦,也就是说这样备份的数据不容易恢复到其他的数据库里头去.

其实mysqldump还有更多强大和灵活的数据导入功能,如果与load命令想结合将很灵活的实现不同数据库之间的备份和恢复.

先看看mysqldump命令介绍吧:http://www.top169.net/Article/Database/d03/200509/Article_14746.htm

下面我们就把上面连接中几个常用的东西扣出来,主要介绍如何导出数据库的表结构(create语句),数据(insert语句),表结构定义和文本内容,然后介绍如何执行类似批处理文件sql脚本,以及如何把文本内容导入到数据库内.
[注:我同样以一个数据库名为falcon_search的数据库来介绍]

首先,我们导出数据库的表结构
Quote:

mysqldump -d falcon_search >falcon_search.sql



我们发现falcon_search.sql中的内容如下:
-- MySQL dump 9.10
--
-- Host: localhost   Database: falcon_search
-- ------------------------------------------------------
-- Server version     4.0.18-nt

--
-- Table structure for table `cat_tab`
--

CREATE TABLE cat_tab (
id int(11) NOT NULL default '0',
cat char(100) binary NOT NULL default '',
postfix char(1) binary default NULL,
pid int(11) default NULL,
ipid int(11) NOT NULL default '0',
acctime int(11) default NULL,
PRIMARY KEY (id,ipid)
) TYPE=MyISAM;

--
-- Table structure for table `file_tab`
--

CREATE TABLE file_tab (
file char(100) binary NOT NULL default '',
postfix char(4) binary NOT NULL default '',
pid int(11) default NULL,
ipid int(11) default NULL,
acctime int(11) default NULL
) TYPE=MyISAM;

--
-- Table structure for table `key_tab`
--

CREATE TABLE key_tab (
skey char(100) binary NOT NULL default '',
acctime int(11) default '0',
UNIQUE KEY skey (skey)
) TYPE=MyISAM;

--
-- Table structure for table `site_tab`
--

CREATE TABLE site_tab (
id int(11) NOT NULL default '0',
site varchar(15) NOT NULL default '',
port int(11) default '21',
user varchar(15) NOT NULL default 'anonymous',
pw varchar(15) NOT NULL default 'falcon',
acc enum('N','Y') default 'N',
indb enum('N','Y') default 'N',
info text,
PRIMARY KEY (id)
) TYPE=MyISAM;

里头有详细的信息,包括数据库名,以及各个表的结构.

现在我们导出数据(insert语句)

mysqldump -t falcon_search >falcon_search.txt
注意:这里的falcon_search.txt里头的内容是一些insert语句,也是sql脚本,在创建好对应的数据库后可以直接执行

直接导出上面两项到一个文件中

mysql falcon_search >falcon_search.sql

这里的falcon_search.sql将包括上面两项内容

导出表结构以及对应表中数据的文本文件

mysqldump -T . falcon_search

生成8个文件,分别是4个表的定义文件,和四个表数据对应的文本文件

注意这个时候的参数哦,有两项包括-T(大写)以及.(当前路径,指明导出数据存放的路径,你完全可以指明为其他的路径)

补充:导出为文本格式的数据还有一个办法
例如,我要导出file_tab中的所有数据到falcon_search.txt

select * into outfile "falcon_search.txt" from file_tab;

注意:默认路径不再是bin目录下,而是mysql/data路径下,其实你可以自己指明路径

到这里我们很灵活的获得了数据库的集中形式了.

下面得介绍一下备份的孪生兄弟[恢复]哦

我们分别根据我们已经得到的备份文件来进行恢复
[注:假设我们下面进行的恢复操作是完全在一个刚安装的mysql上进行的]

第一种情况

假如我们得到的是表结构(creat语句)以及数据(insert语句)的sql脚本,即我们上面得到的falcon_search.sql和falcon_search.txt

那么我们先根据脚步里头的表结构脚本里头的数据库名创建相应的数据库

create database falcon_search;

然后先在falcon_search.txt文件的最前面添加上一句

use falcon_search;

接着直接执行表结构对应的sql脚本

mysql <falcon_search.sql

这样我们就已经创建好了数据库和表拉,剩下的是插入数据

同样我们先加入这么一句到falcon_searh.txt的最前面

use falcon_search;

接着类似执行

mysql <falcon_search.txt

这样我们就进行第一种情况的恢复工作

第二种情况

假如我们得到仅有falcon_search.sql,即里头即包含了表结构也包含了数据,那么我们恢复工作更简单拉

先创建falcon_search数据库
然后在falcon_search.sql语句的最前面添加一句

use falcon_search;

接着执行falcon_search.sql脚本就可以

mysql <falcon_search.sql


第三种情况

假如我们获得的是每个表的表结果文件(表名.sql)以及各个表的数据对应的文本文件

我们进行的工作实质上同上

先创建数据库[根据表结构文件中database的名]
然后在每个sql脚本前面加上
use falcon_search;
接着执行各个sql脚本,创建各个表
然后我们的重要内容是把文本文件导入到各个表中拉

这里重点介绍一下
需要用load data local infile "文本文件(如果不是当前路径请指明绝对路径)" into table 表名;
说明,其中local指明为从本地文件导入

假如我要把当前目录下(bin)的site_tab.txt里头的内容导入到site_tab中
只要

先进入mysql的命令行下

mysql>use falcon_search;
msyql>load data local infile "site_tab.txt" into table site_tab;

使用load的好处是,可以很方面通过文本文件这个途径把其他数据库中的内容导入到mysql中,从而作到不同数据库之间数据的转换拉。

ok,到这里基本上就完了
如果有问题可以在后面跟帖哦

posted @ 2008-03-14 16:14 随意门 阅读(370) | 评论 (0)编辑 收藏
在mysql中使用全文索引

作者: falcon   发表日期: 2006-04-25 10:54   复制链接



引言:

在使用like进行模糊查询,当数据量大到一定程序的时候,我们会发现查询的效率是相当低下的。下面就此介绍一下mysql提供全文索引和搜索的功能。

正文:

下面是从参考资料里头摘录下来的内容,具体使用见参考资料,那里更详细哦


1) 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELECT查询中 的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候。
  MySQL 针对这一问题提供了一种基于内建的全文查找方式的解决方案。在此,开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段 运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索,因为MySQL使用自然语言来智能地对 结果评级,以去掉不相关的项目。

2)到 3.23.23 时,MySQL 开始支持全文索引和搜索。全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。

全文搜索通过 MATCH() 函数完成。


下面大概介绍一下创建全文索引的过程,主要有两种办法:
第一种是创建表的时候就创建全文索引,第二种类是在创建表以后再增加全文索引,通过上面的引文我们知道后者比前者有些好处

1、先创建表,然后通过"AlTER TABLE"增加全文索引

mysql> create database ftt;   --创建数据库
Query OK, 1 row affected (0.03 sec)
mysql> use ftt;           --使用数据库
Database changed
mysql> create table reviews     --创建表
  -> (
  -> id int(5) primary key not null auto_increment,
  -> data text
  -> );
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT ignore INTO `reviews` (`id`, `data`) VALUES(1, 'Gingerboy has a new singl
e out called Throwing Rocks. It\'sgreat!'); --下面三句都是插入数据
Query OK, 1 row affected (0.06 sec)

mysql> INSERT ignore INTO `reviews` (`id`, `data`) VALUES (2, 'Hello all, I really like
the new Madonna single. One of the hottest tracks currently playing...I\'ve bee
n listening to it all day');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT ignore INTO `reviews` (`id`, `data`)VALUES (3, 'Have you heard the new ba
nd Hotter Than Hell?They have five members and they burn their instruments when
they play in concerts. These guys totally rock! Like, awesome, dude!');
Query OK, 1 row affected (0.00 sec)

mysql> alter table reviews add fulltext index (data);   --通过alter增加全文索引
Query OK, 3 rows affected (0.16 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select id from reviews where match (data) against ('Madonna'); --通过match和against实现全文检索
+----+
| id |
+----+
| 2 |
+----+
1 row in set (0.00 sec)

mysql> select id from reviews where match (data) against ('+Madonna+instruments'
); --搜索出包含Madonna或者instruments的所有记录的id号
+----+
| id |
+----+
| 2 |
| 3 |
+----+
2 rows in set (0.00 sec)

mysql> select id from reviews where match (data) against ('Mado*' in boolean mod
e); --检索出包含Mado的所有记录的id
+----+
| id |
+----+
| 2 |
+----+
1 row in set (0.00 sec)


补充
  从上面的结果不难看出,mysql的全文索引和检索支持多关键字,从下面的参考资料,你还可以发现更多实现,看看去哦

2、在创建表的时候就创建全文索引

由于其他的内容和上面差不多,下面只给出创建时的语法


Code:

[Ctrl+A Select All]



参考资料:

1)如何在MySQL中获得更好的全文搜索结果 http://dev.21tx.com/2006/04/05/10735.html
[主要介绍了全文检索和搜索是怎么用的]

2)mysql全文检索http://www.jolr.com/forum/?display=topic&id=4856&s=371cda7ed1694f669f75610dde769c82
[主要介绍了全文检索的一些语法知识等]
另外,如果想要看最原始的资料,请上mysql官方网站,http://www.mysql.com
大家注意拉,mysql5以后才支持视图和存储过程
要是想要使用这些东西,可以到www.mysql.cn或者www.phpchina.cn下载mysql5.0.18哦

1)下面是mysql下存储过程的使用
http://www.mimi163.net/cs/wenzhang/2006/3/16/996.htm
有时间写篇关于mysql和其他数据库存储过程使用的比较,呵呵
感觉这个东西还是很有用的拉
2)另外,这里有一篇介绍php怎么调用mysql的存储过程的
也是相当的不错,呵呵
http://www.ithack.net/Articles/php/2005052595601.html

不过上面的东西,我还没有测试过,正在使用中...
后面用了一下感觉不错

对拉,注意这个东西的意思哦
delimiter // --- 这是定义结束符为“//”

解决了mysql5中直接创建全文索引时的一个问题

问题为:
ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes

解决:
http://www.dmresearch.net/shijun/?p=108
好东西,先放这里

《PHP 字符串操作入门教程 》
http://study.zhupao.com/infoview/Article_16867.html
我自己试了后精简说一下:

问题:
ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes
解决办法:
如果你以前使用:
create table test
(
id int not null primary key,
name text,
fulltext(name)
);
出错
那么现在使用
create table test
(
id int not null primary key,
name text,
fulltext(name)
)type=myisam;
就可以解决
或者把type用engine代替

补充:
在我使用的时候
mysql4.0竟然没有这个问题,但是使用mysql5.0的时候到出现,不过用上面办法就解决拉

posted @ 2008-03-14 16:13 随意门 阅读(1156) | 评论 (0)编辑 收藏
mysql5触发器使用实例

作者: falcon   发表日期: 2006-05-06 15:13   复制链接



引言:

触发器的作用就不用说了吧,也许你在sqlserver或者其他的数据库里头早就用过触发器拉.所以这里直接介绍mysql5下怎 么使用触发器.具体的语法细则这里也不说,可以到搜索引擎里头搜索"mysql5 触发器",一大堆的参考资料,不过基本上是一个出身,都只简单介绍了语法.没有太多实际的例子.下面就从实际例子出发来学习一下哦.

正文:

我们先假设我们有这样一个用户信息表、用户评价表:
[说明:我们的表可能建得不大规范,不要追究这个,因为仅仅是个演示触发器的例子哦]

表名:(用户表)User_tab、(用户评价表)User_score

User_tab表结构如下:

字段名   字段类型           键     备注
用户编号(id)       int     pk     auto_increment
登陆名(login_name) varchar(20)   not null    
登陆密码(login_pw)   varcahr(20) not null
加密密码(login_enc_pw)   varchar(32)
注册时间(reg_time)   datetime

User_score表结构如下:

用户编号(id)   int fk User_tab(id)
用户评价(score) int


我们对该表有如下操作:

1)在用户注册的时候需要用户输入登陆名、登陆密码,用户编号,加密密码和注册时间由系统自动更新
2)假如我们要删除某个用户信息,那么该用户的评价信息也得删除,我们也让系统自动实现


先创建这两个表哦,代码就不列出拉。

下面我们为了让系统自动实现这些东西,写两个触发器

1)触发器一[更新操作]
功能:在插入用户的登陆名和登陆密码进入数据库之后,系统自动更新该用户的注册时间和加密密码信息(用户编号不用我们做,是因为我们设置了auto_increment,所以系统会自增)
名字:User_tab_before_insert(表名_触发时机_操作)
代码:


Code:

[Ctrl+A Select All]



2)触发器二[删除操作]
功能:在删除某个用户信息之后,系统自动删除该用户的评价信息
名字:User_tab_before_delete
代码:


Code:

[Ctrl+A Select All]



总结:

到这里我们要用的触发器的功能基本实现拉。我们通常要用户要做的操作也就这些:自动实现某些功能,以维护数据库的完整性和一致性。
需要补充的是,在创建那些需要触发器更新的数据的时候,请不要设置not null,否则,由于在插入时会出错。因为它在触发器起作用之前为空。

由于本人水平有限,如有问题,请批评指正,谢谢

为了保持参照完整性,可以通过在对应具有外键约束的字段后面增加ON DELETE CASCADE

具体参考这个
《在MySQL中利用外键实现级联删除!》
http://www.chinaunix.net/jh/17/462977.html

posted @ 2008-03-14 16:11 随意门 阅读(503) | 评论 (0)编辑 收藏
MySQL用户密码管理几法

作者: falcon   发表日期: 2006-06-13 19:54   复制链接



下面的这个来自:
http://www.yesky.com/searchdatabase/504969419638702080/20050224/1914572.shtml


在MySQL中修改一个用户(比如叫"hunte")的密码,可以用如下3个办法:

  #在控制台上输入
  bash$ mysql -u root mysql
  #用mysql客户程序
  mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='hunte';
  mysql> FLUSH PRIVILEGES;
  mysql> QUIT


  #在控制台上输入
  bash$ mysql -u root mysql
    #用mysql客户程序
  mysql> SET PASSWORD FOR hunte=PASSWORD('new password');
  mysql> QUIT


  #直接在控制台上输入
  bash$ mysqladmin -u root "old password" "new password"


1)其实,上面的所有命令操作的对象都是mysql.user(mysql数据库的user表),而第一种操作方法刚好放映了这个,不相信。你查看一下mysql.user的内容。

2)另外,我们可以在分配权限给用户的时候,直接指定该用户的密码,具体操作可以是这个样子


falcon@falcon:~$ sudo -s
Password:
root@falcon:~# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14 to server version: 5.0.21-Debian_3ubuntu1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> grant all on *.* to 54falcon identified by '54falcon';
Query OK, 0 rows affected (0.51 sec)

mysql> quit
Bye
root@falcon:~# mysql -u 54falcon -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16 to server version: 5.0.21-Debian_3ubuntu1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> select user,password from mysql.user where user='54falcon';
+----------+------------------+
| user   | password       |
+----------+------------------+
| 54falcon | 3e4722567adf268d |
+----------+------------------+
1 row in set (0.01 sec)


看到没有阿,密码已经指定阿,而且54falcon用户的权限也是不小的,呵呵。

3)诶,上面我们提到,既然用户和密码信息存放在mysql.user里头,我们是不是可以直接通过操作mysql.user来进行用户和密码的管理呢?回答是肯定的拉,呵呵

看看

mysql> insert into mysql.user(user) values('5454falcon');
Query OK, 1 row affected (0.02 sec)

mysql> select user from mysql.user where user like '%falcon%';
+------------+
| user     |
+------------+
| 5454falcon |
| 54falcon   |
| falcon   |
+------------+
3 rows in set (0.04 sec)


看到没,最上面的那个用户就是我们刚才插入的哦,要是想给个密码,用最开始给出方法就可以搞定拉。

诶,到此结束拉。

posted @ 2008-03-14 16:10 随意门 阅读(419) | 评论 (0)编辑 收藏
数据库基本操作

作者: falcon   发表日期: 2006-08-30 15:15   复制链接



这里总结几个常用数据相关操作

1. 重新启动数据库

Quote:

sudo -u mysql /path/to/mysqld_safe


如果想查找mysqld_safe的路径,用
Quote:

whereis mysqld_safe



2. 远程登录数据库

首先在服务器上创建一个远程用户

Quote:

GRANT SELECT,INSERT,UPDATE,DELETE ON [db_name].* TO [username]@[ipadd] identified by '[password]';



然后远程登录,注意你的用户名、密码和本地ip地址都必须似乎上面的语句里头指定的
Quote:

mysql -u username -h serveripaddress -p



3.  查看数据库日志

一般情况下,数据库日志存放的目录在: /usr/local/mysql/var/

查看下面的*.rr文件即可

4. 查看最近一段时间执行的系统脚本

Quote:

more $HOME/.bash_history



5. 查看系统日志

系统日志在/var/log下面,要经常检查日志,防止非法分子登录或者有部分管理人员的误操作等<br>

6. mysql备份

数据库的备份是个非常重要的东西,下面有详细的参考资料

参考资料

1。理解linux的日志文件
http://edudata.ccut.edu.cn/linux/linux%D3%C5%D0%E3%CE%C4%D5%C2/linux/linux110.htmlinux
系统日志介绍http://www.window07.com/other/2006-2-28/k37575.htm

2。无法远程登录mysql解决办法http://www.webasp.net/article/21/20985_print.htm

3。mysql增量备份脚本
http://news.weixiuwang.com/server/2006-5/2006E5Y31;93334E22814353.htm<br>

posted @ 2008-03-14 16:10 随意门 阅读(220) | 评论 (0)编辑 收藏
让mysql回归传统服务模式!

作者: falcon   发表日期: 2006-09-23 14:02   复制链接



让mysql回归传统服务模式!

如果稍微用过mysql
你就会发现,以前的一些版本的mysql对无效数据的约束是很“不传统”的
比如,你把NULL插入NOT NULL字段,mysql服务器不会报错
而仅仅是出现警告,然后你用show warnings可以查看到底警告你什么
有些情况,它连警告都不给
如果是这样,那些not null的字段完整性约束简直就成了一个摆设

还好,在MySQL 5.0.2之后这些约束更加严格拉
我们可以通过设置sql-mode环境变量来恢复“传统”模式
——即对一些非空,唯一等的约束保持完整性

具体我们可以通过两种办法来弄

1。在启动mysql的时候,加入--sql-mode='STRICT_TRANS_TABLES',即
Quote:

path/to/mysqld --sql-mode='STRICT_TRANS_TABLES'


注意,需要有super权限。

2。启动后也可以设置sql-mode变量
可以是针对当前会话的,也可以是所有会话的
Quote:

set [session|global] sql_mode='STRICT_TRANS_TABLES'



这样设置了以后,就遵从标准的sql拉
在诸如把空数据插入非空字段的时候不再是警告而是报错并且禁止插入数据。


参考资料:

对无效数据的约束
http://dev.mysql.com/doc/refman/5.1/zh/introduction.html#constraints

SQL服务器模式
http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#server-sql-mode

posted @ 2008-03-14 16:09 随意门 阅读(215) | 评论 (0)编辑 收藏
mysql备份与恢复时两个错误解决办法

作者: falcon   发表日期: 2007-01-19 21:11   复制链接



1. ERROR 1062 (23000) at line 1936: Duplicate entry ' ' for key 2

这个错误是我在恢复数据库的时候遇到的,我从mysql4.1.7的版本里头用
Quote:

mysqldump -u user_name -p db_name > db_name.sql


备份了数据,准备恢复到mysql5.0.12中,但是新版本对primary key的检查更严格
因此,在我这样恢复的时候就出现了上面的错误
Quote:

mysql -u user_name -p db_name < db_name.sql



解决办法:

在插入数据的时候忽略掉那个重复的项目,即在insert后面增加ignore,那么这么多的插入语句,怎么一条一条的加入呢,办法很简单,用sed
Quote:

sed -e 's/INSERT INTO/INSERT ignore INTO/g' db_name.sql > db_name_ignore.sql



2. ERROR 1005 (HY000): Can't create table

有时候在用
Quote:

mysql -u user_name -p db_name < db_name.sql


恢复数据库的时候,可能出现这样的问题
但是,有时候可以这么简单的解决

解决办法:把数据库删了,重新创建一个,然后再把数据库导入进去
Quote:

shell> drop database db_name
shell> create database db_name


然后再导入数据用mysql -u user_name -p db_name < db_name.sql



补充:

当然,可能错误的原因并不一样哦,另外在这里你会发现shell是多么有用,所以诸如sed,grep,awk,uniq,sort,netstat,tracepath等等一些常见的工具最好还是花费一些时间认真学习一下吧。

posted @ 2008-03-14 16:09 随意门 阅读(410) | 评论 (0)编辑 收藏
仅列出标题
共9页: 1 2 3 4 5 6 7 8 9