MySQL Weed
使用MySQL的過程中,收集的一些小知識。(2007.09.04最后更新)
簡單SQL語句
創建/刪除數據庫
CREATE DATABASE mydb
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
DROP DATABASE mydb
創建數據表
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
創建/刪除索引
CREATE INDEX idxTitle ON titles (title)
ALTER TABLE titles ADD INDEX idxTitle (title)
SHOW INDEX FROM tablename -- 列出數據表tablename的索引
DROP INDEX indexname ON tablename
ALTER TABLE titles ADD INDEX idxTitle (title(16))
變更表結構
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啟動
vi /etc/rc.d/rc.local
加入語句: ./mysqld_safe --user=mysql &
改變root用戶密碼
mysql> update mysql.user set password=password('YourPwd') where user='root';
mysql> flush privileges;
增加新用戶
[1]添加一用戶,使它擁有所有權限
mysql> grant all on mydb.* to myuser@"myhost" Identified by "mypassword";
[2]簡單添加一用戶
mysql> insert into mysql.user (host, user, password) values('%', 'NewUser', password('NewUserPwd'));
mysql> flush privileges;
注:最好使用grant命令。
刪除用戶
mysql> drop user userName;
啟動/關閉MySQL服務器
啟動(Linux下): mysqld_safe -u mysql &
關閉: mysqladmin -uUser -pPassword -hHost shutdown
導出/導入數據
導出:
mysqldump -uUser -pPasswd -hHost -B DB_NAME > SQL_FILE_PATH -- 將數據庫DB_NAME全部導出到SQL_FILE_PATH文件中
mysqldump -uUser -pPassword -hHost DATABASE_NAME --tables TABLE_NAME > SQL_FILE_PATH -- 將數據庫DB_NAME中的表TABLE_NAME導出
導入:
mysql -uUser -pPassword -hHost < SQL_FILE_PATH -- 將數據文件導入MySQL服務器中。注:該文件中必須有建數據庫的語句。
mysqldump -uUser -pPassword -hHost -B DB_NAME < SQL_FILE_PATH -- 將數據文件導入MySQL服務器的DB_NAME數據庫中。注:該文件中沒有建數據庫的語句。
注意:在導入數據庫之前,需要在MySQL中新建一個名為DATABASE_NAME的空數據庫。
啟動日志
修改mysql.ini/mysql.cnf文件,在[mysqld]后添加如下形式的語句。
log="Absolte_Path_To_Log/sys.log"
log-update=" Absolte_Path_To_Log/ sys_update.log"
使MySQL區分大小寫
修改文件my.ini/my.cnf,在選項組[mysqld]之后添加
lower_case_table_names=2
修改某用戶的登錄密碼
mysqladmin -uUser -pOldPasswd passwd NewPasswd
mysql>update user set password=PASSWORD("NewPasswd") where user="myuser" and host="myhost";
查看表結構
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程序調用存儲過程,報權限不足
前提:數據庫mydb中有存儲過程myproc;MySQL用戶myuser@localhost,擁有數據庫mydb的所有權限(grant all on mydb.* to myuser);使用MySQL官方JDBC驅動(如mysql-connector-java-5.0.4.jar),在Java應用程序中調用myproc。
在執行該Java應用程序時,可能出現如下問題:
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 執行該存儲過程的權限不足。但如果直接在MySQL客戶端中使用 myuser@localhost 用戶調用myproc,則沒有任何權限問題。
這其實是MySQL官方JDBC驅動的問題,因為JDBC驅動的代碼中除了調用 myproc外,還做了其它操作。這就可能出現權限問題。可以有如下兩種解決方法:
[1]修改myproc的definer。雖然myuser已經擁有了mydb的所有權限,但由于JDBC驅動的問題,如果myproc的definer不是 myuser@localhost,那么該用戶仍然無法執行存儲過程。修改definer的值,使其為 myuser@localhost。
[2]賦予 myuser@localhost對表mysql.proc的查詢權限。在前面的錯誤提示( SELECT privilege on mysql.proc to parse column types )中已經表明了這一點,可以執行如下授權語句:grant select on mysql.proc to myuser@localhost。
注:由于是MySQL JDBC驅動的問題,所以上述解決方法都不太好。所以在直接新建存儲過程,或導入SQL文件(文件中包含創建存儲過程的語句)使用的MySQL用戶,最好與在Java應用程序中使用的MySQL用戶保持一致。
updating...