John Jiang

a cup of Java, cheers!
https://github.com/johnshajiang/blog

   :: 首页 ::  :: 联系 :: 聚合  :: 管理 ::
  131 随笔 :: 1 文章 :: 530 评论 :: 0 Trackbacks
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...
posted on 2006-08-12 09:19 John Jiang 阅读(890) 评论(0)  编辑  收藏 所属分类: DatabaseMySQL

只有注册用户登录后才能发表评论。


网站导航: