MySQL Weed
使用MySQL的過(guò)程中,收集的一些小知識(shí)。(2007.09.04最后更新)
簡(jiǎn)單SQL語(yǔ)句
創(chuàng)建/刪除數(shù)據(jù)庫(kù)
CREATE DATABASE mydb
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
DROP DATABASE mydb
創(chuàng)建數(shù)據(jù)表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tblname (
colname1 coltype coloptions reference,
colname2 coltype coloptions reference, ...
[, index1, index2, ...])
[ENGINE = MyISAM | InnoDB | HEAP]
[DEFAULT CHARSET = csname [COLLATE = colname]]
CREATE TABLE titles (
titleID INT NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
subtitle VARCHAR(100),
edition TINYINT,
pubID INT,
catID INT,
langID INT,
year INT,
isbn VARCHAR(20),
comment VARCHAR(255),
ts TIMESTAMP,
PRIMARY KEY (titleID),
KEY pubIdIndex (pubID),
KEY langID (langID),
KEY catID (catID),
KEY title (title),
CONSTRAINT titles_ibfk_1 FOREIGN KEY (pubID)
REFERENCES publishers (pubID),
CONSTRAINT titles_ibfk_2 FOREIGN KEY (langID)
REFERENCES publishers (langID),
CONSTRAINT titles_ibfk_3 FOREIGN KEY (catID)
REFERENCES categories (catID))
ENGINE = InnoDB
DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci
CREATE TABLE table2 SELECT * FROM table1 where id <= 10;
DROP TABLE mytitle
創(chuàng)建/刪除索引
CREATE INDEX idxTitle ON titles (title)
ALTER TABLE titles ADD INDEX idxTitle (title)
SHOW INDEX FROM tablename -- 列出數(shù)據(jù)表tablename的索引
DROP INDEX indexname ON tablename
ALTER TABLE titles ADD INDEX idxTitle (title(16))
變更表結(jié)構(gòu)
ALTER TABLE tablename ADD newcolumn coltype coloptions [FIRST | AFTER]
ALTER TABLE tablename CHANGE oldcolname newcolumn coltype coloptions
ALTER TABLE tablename DROP colname
ALTER TABLE tblname ADD PRIMARY KEY (indexcols ...)
ALTER TABLE tblname ADD INDEX [indexname] (indexcols ...)
ALTER TABLE tblname ADD UNIQUE [indexname] (indexcols ...)
ALTER TABLE tblname ADD FULLTEXT [indexname] (indexcols ...)
ALTER TABLE tblname ADD FOREIGN KEY [idxname]
(column1) REFERENCES table2 (column2)
ALTER TABLE tblname DROP PRIMARY KEY
ALTER TABLE tblname DROP INDEX indexname
ALTER TABLE tblname DROP FOREIGN KEY indexname
ALTER NAME tablename ENGIEN typename
MySQL伴隨Linux啟動(dòng)
vi /etc/rc.d/rc.local
加入語(yǔ)句: ./mysqld_safe --user=mysql &
改變r(jià)oot用戶密碼
mysql> update mysql.user set password=password('YourPwd') where user='root';
mysql> flush privileges;
增加新用戶
[1]添加一用戶,使它擁有所有權(quán)限
mysql> grant all on mydb.* to myuser@"myhost" Identified by "mypassword";
[2]簡(jiǎn)單添加一用戶
mysql> insert into mysql.user (host, user, password) values('%', 'NewUser', password('NewUserPwd'));
mysql> flush privileges;
注:最好使用grant命令。
刪除用戶
mysql> drop user userName;
啟動(dòng)/關(guān)閉MySQL服務(wù)器
啟動(dòng)(Linux下): mysqld_safe -u mysql &
關(guān)閉: mysqladmin -uUser -pPassword -hHost shutdown
導(dǎo)出/導(dǎo)入數(shù)據(jù)
導(dǎo)出:
mysqldump -uUser -pPasswd -hHost -B DB_NAME > SQL_FILE_PATH -- 將數(shù)據(jù)庫(kù)DB_NAME全部導(dǎo)出到SQL_FILE_PATH文件中
mysqldump -uUser -pPassword -hHost DATABASE_NAME --tables TABLE_NAME > SQL_FILE_PATH -- 將數(shù)據(jù)庫(kù)DB_NAME中的表TABLE_NAME導(dǎo)出
導(dǎo)入:
mysql -uUser -pPassword -hHost < SQL_FILE_PATH -- 將數(shù)據(jù)文件導(dǎo)入MySQL服務(wù)器中。注:該文件中必須有建數(shù)據(jù)庫(kù)的語(yǔ)句。
mysqldump -uUser -pPassword -hHost -B DB_NAME < SQL_FILE_PATH -- 將數(shù)據(jù)文件導(dǎo)入MySQL服務(wù)器的DB_NAME數(shù)據(jù)庫(kù)中。注:該文件中沒(méi)有建數(shù)據(jù)庫(kù)的語(yǔ)句。
注意:在導(dǎo)入數(shù)據(jù)庫(kù)之前,需要在MySQL中新建一個(gè)名為DATABASE_NAME的空數(shù)據(jù)庫(kù)。
啟動(dòng)日志
修改mysql.ini/mysql.cnf文件,在[mysqld]后添加如下形式的語(yǔ)句。
log="Absolte_Path_To_Log/sys.log"
log-update=" Absolte_Path_To_Log/ sys_update.log"
使MySQL區(qū)分大小寫
修改文件my.ini/my.cnf,在選項(xiàng)組[mysqld]之后添加
lower_case_table_names=2
修改某用戶的登錄密碼
mysqladmin -uUser -pOldPasswd passwd NewPasswd
mysql>update user set password=PASSWORD("NewPasswd") where user="myuser" and host="myhost";
查看表結(jié)構(gòu)
mysql> describe TableName
修改表的字符集
mysql> alter table tblName convert to character set charsetName
修改表的表類型
mysql> alter table tblName engine engineType
SHOW
show character set -- 查看字符集
show collation
show columns
show create database
show create procedure and show create function
show create table
show create view
show databases
show engine
show engines
show errors
show grants
show index
show innodb status
show logs
show mutex status
show open tables
show privileges
Java程序調(diào)用存儲(chǔ)過(guò)程,報(bào)權(quán)限不足
前提:數(shù)據(jù)庫(kù)mydb中有存儲(chǔ)過(guò)程myproc;MySQL用戶myuser@localhost,擁有數(shù)據(jù)庫(kù)mydb的所有權(quán)限(grant all on mydb.* to myuser);使用MySQL官方JDBC驅(qū)動(dòng)(如mysql-connector-java-5.0.4.jar),在Java應(yīng)用程序中調(diào)用myproc。
在執(zhí)行該Java應(yīng)用程序時(shí),可能出現(xiàn)如下問(wèn)題:
test_proc executed failed because : Driver requires declaration of procedure to either contain a '\nbegin' or '\n' to follow argument declaration, or SELECT privilege on mysql.proc to parse column types.
這表示用戶 myuser@localhost 執(zhí)行該存儲(chǔ)過(guò)程的權(quán)限不足。但如果直接在MySQL客戶端中使用 myuser@localhost 用戶調(diào)用myproc,則沒(méi)有任何權(quán)限問(wèn)題。
這其實(shí)是MySQL官方JDBC驅(qū)動(dòng)的問(wèn)題,因?yàn)镴DBC驅(qū)動(dòng)的代碼中除了調(diào)用 myproc外,還做了其它操作。這就可能出現(xiàn)權(quán)限問(wèn)題。可以有如下兩種解決方法:
[1]修改myproc的definer。雖然myuser已經(jīng)擁有了mydb的所有權(quán)限,但由于JDBC驅(qū)動(dòng)的問(wèn)題,如果myproc的definer不是 myuser@localhost,那么該用戶仍然無(wú)法執(zhí)行存儲(chǔ)過(guò)程。修改definer的值,使其為 myuser@localhost。
[2]賦予 myuser@localhost對(duì)表mysql.proc的查詢權(quán)限。在前面的錯(cuò)誤提示( SELECT privilege on mysql.proc to parse column types )中已經(jīng)表明了這一點(diǎn),可以執(zhí)行如下授權(quán)語(yǔ)句:grant select on mysql.proc to myuser@localhost。
注:由于是MySQL JDBC驅(qū)動(dòng)的問(wèn)題,所以上述解決方法都不太好。所以在直接新建存儲(chǔ)過(guò)程,或?qū)隨QL文件(文件中包含創(chuàng)建存儲(chǔ)過(guò)程的語(yǔ)句)使用的MySQL用戶,最好與在Java應(yīng)用程序中使用的MySQL用戶保持一致。
updating...