ORACLE基础学习(MYSQL)

10 附录—MYSQL
MYSQL作为一个小巧、灵活、高效的开源数据库,可以作为象Oracle这样的大型商业数据库的有益补充。并不是所有场合都需要Oracle等数据库的高可靠性和高可扩展性,没有必要盲目支付昂贵的软件费用。所以在本附录里作一点介绍。
10.1 安装配置
笔者选择的安装平台是RedHat Linux 7.3,在mysql的网站[url]www.mysql.com[/url]里有rpm格式的安装文件,版本号3.23.52的标准版,包括Server、Benchmark/test suites、Client programs、Libraries and Header files for development、Client shared libraries等数个rpm文件。
以root用户登录,依次安装rpm包,大致顺序先装库,再装server,client。
安装结束后,mysql已经启动。下面对数据库作一些调整。
以root用户登录。
关闭数据库:
mysqladmin shutdown -uroot
mysql的启动脚本是/usr/bin/safe_mysqld,打开它,找到MY_BASEDIR_VERSION, DATADIR,ledir所在的区域,这是一个if … then … elif … then … else … fi的结构,到最后一个else块,修改这三个变量为:
MY_BASEDIR_VERSION=/
DATADIR=/opt/mysql #数据库所在目录
ledir=/usr/sbin #mysql系统程序mysqld所在目录
原来的DATADIR为/var/lib/mysql,肯定要根据实际情况改变的。
将/var/lib/mysql/下的mysql目录复制到新的DATADIR即/opt/mysql下。
在/usr/share/doc/packages/MySQL下能找到my.cnf的不同配置,选一个符合实际情况的配置,复制成/etc/my.cnf。
启动数据库:
safe_mysqld &
mysql在安装过程中产生/etc/init.d/mysql,设置各/etc/rc.d对它的符号连接,这样mysql的启动关闭可以让操作系统自动完成。
10.2 管理
10.2.1 初始调整
第一次进入mysql,没有任何验证。
以root用户登录mysql:
mysql -uroot
选择数据库mysql,即mysql的系统数据库:
mysql>;use mysql
操作数据字典,重新设置root用户口令:
在数据库mysql中,db,user和host构成了最基本的数据字典,主要功能为检查数据库连接的有效性。
mysql>;delete from user where user<>;’root’;
mysql>;update user set password=password(‘mysql’) where user=’root’;
建立新数据库:
mysql>;create database data;
去除数据库:drop database data;
建立普通用户dbuser,赋予权限:
mysql>;insert into user (host,user,password) values(‘%’,’dbuser’,password(‘mysql’)); #表名和域列表之间一定要有空格,如user (…)
mysql>;grant select,insert,update,delete,create,drop,index,alter on data.* to dbuser;
重载mysql系统信息:
mysql>;exit
mysqladmin reload –uroot
从此以后,对root用户的验证已经建立起来,这样使用mysqladmin的操作必须加上口令验证:
mysqladmin shutdown –uroot –pmysql
mysqladmin reload –uroot -pmysql
10.2.2 建立用户对象
登录:
mysql data –udbuser –pmysql
mysql>;show databases; #显示现有的数据库
mysql>;show tables; #显示本数据库中的表
mysql>;show columns from emp; #显示表结构
mysql>;desc emp; #与上面相同
mysql>;show index from emp; #显示表所有的索引
mysqll>;show status; #显示系统配置信息
mysql>;show table status; #显示表状态
mysql>;show grants for dbuser; #显示用户所有的权限
建立表和索引:
mysql>;create table emp(no numeric(12) not null,upd_ts timestamp not null,…);
mysql>;drop table emp;
mysql>;alter table emp add primary key (no);
mysql>;alter table drop primary key;
mysql>;alter table emp add index emp_x01 (name);
mysql>;alter table drop index emp_x01;
也可以将sql语句写成一个脚本,重定向到mysql中去:
mysql data –udbuser –pmysql <db.sql
10.3 开发
参见附件10_mysql/
10.3.1 连接和断开
首先定义数据库连接的数据结构mysql以及衍生的连接句柄sock(参见dbcom.h):
MYSQL mysql;
MYSQL *sock;
为了简化编程,将本连接的res(资源句柄),row(域指针数组)和sql(sql语句缓冲区)也一起定义好:
MYSQL_RES *res;
MYSQL_ROW row;
char *sql;
建立连接(参见dbcom.c中DbsConnect):
mysql_init(&mysql);
sock=mysql_real_connect(&mysql, host, username, password, dbname, 0, NULL, 0));
如果是本机,则host为NULL。
username(数据库用户名),password(口令),dbname(数据库名)是”dbuser”,”mysql”,”data”这样的组合。
sql=(char *)malloc(…);
断开连接(参见dbcom.c中DbsDisConnect):
mysql_close(sock);
free(sql);
10.3.2 无结果集的sql语句
参见dbfunc.c中DbsRESUME_INS。
指insert,update,delete语句,执行以后它们只是返回错误值,因此可以用统一的形式完成。
strcpy(sql, “insert into emp values(…)”);
mysql_query(sock, sql);
10.3.3 有结果集的sql
指select语句,为简化编程,这里分两种情况:根据unique约束的select和根据一般条件的select,前者可以写得更简洁一些。笔者把前者称之为“选取”,后者为“游标”。
选取:
参见dbfunc.c中DbsEMP_SEL。
strcpy(sql, “select name from emp where no=1”);
mysql_query(sock, sql);
res=mysql_store_result(sock); #将结果集从mysql服务端读取到客户端
row=mysql_fetch_row(res); #获取本记录域指针
strcpy(name,row[0]); #根据选取域位置复制到用户数据结构中
mysql_free_result(res); #释放记录内容
游标:
参见dbfunc.c中DbsEMP_CUR。
strcpy(sql, “select name from emp where age>;20”);
mysql_query(sock, sql);
res=mysql_use_result(sock);
count=0;
展开游标循环
{
row=mysql_fetch_row(res);
如果已经选完,跳出循环;
strcpy(name[count],row[0]);
count++;
}
mysql_free_result(res);
10.3.4 错误处理
参见dbcom.c中checkerr。
根据文档判断mysql函数调用是否错误。
mysql_errno(sock)指明错误码。
mysql_error(sock)显示错误说明文本。
unsigned int result=mysql_errno(sock);
if(result)
{
printf("errno:%d errmsg:%s/n", result, mysql_error(sock));
}
return result;
有些函数的返回值可能代表正确也可能代表错误,此时必须进行错误判断,如mysql_fetch_row取完最后一条记录后返回的是NULL,而出错也返回NULL,前者为正常情况。
注意mysql错误码处理与其它数据库的不同,如mysql_fetch_row,取完记录并不产生“记录已取完”的错误信息,而是产生“成功”信息。 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值