摘要: 引用: 學習Shell Scripts 如果您真得很想要走信息這條路,并且想要好好的管理好屬于您的主機,那么,別說鳥哥不告訴您,Shell Scripts真的是必須要學習的一項課程!基本上,Shell scripts有點像是早期的批處理文件,亦即是將一些指令匯編起來一次執行,但是Shell scripts擁有更強大的功能,那就... 閱讀全文
作者: 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
作者: 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)%'
到現在,問題基本上完善解決拉
作者: 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,到這里基本上就完了
如果有問題可以在后面跟帖哦
作者: 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的時候到出現,不過用上面辦法就解決拉
作者: 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
作者: 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)
|
|
看到沒,最上面的那個用戶就是我們剛才插入的哦,要是想給個密碼,用最開始給出方法就可以搞定拉。
誒,到此結束拉。
作者: 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>
作者: 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拉
在諸如把空數據插入非空字段的時候不再是警告而是報錯并且禁止插入數據。
參考資料:
作者: 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等等一些常見的工具最好還是花費一些時間認真學習一下吧。