触发器Trigger
在发生某个事件,或满足某个条件时自动被执行的存储过程。
三种不同粒度的触发器:
-
表级:动表n次触发n次
-
行级:动行n次触发n次
-
列级:动列n次触发n次
创建
mysql> delimiter #
mysql> create trigger t_so after insert on score
/*在score表中设置一个触发器*/
-> for each row
-> begin
-> update score set score =76 where sno = 1002 and new.score < 60;
/*设置触发事件:当学号为1002的对象最新的score字段的数值小于60,则会触发事件,将score字段改为76*/
-> end
-> #
数据库备份(导出)和恢复(导入)
容灾和数据库迁移(有备才能无患,永远不要把所有鸡蛋放在一个篮子里!)
- 数据库导出:
mysqldump -u用户名 -p 数据库名 > 数据库名.sql
只需导出表结构:则在 -p 附近带上 -d 参数;
- 数据库导入:
mysql -u用户名 -p 数据库名 < 数据库名.sql
通过 C 语言访问 MySQL数据库
通过调用 MySQL API 函数实现。
通用步骤:
- 连接数据库
- 执行 SQL语句
- 断开连接
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
int insert(MYSQL mysql);
int delete(MYSQL mysql);
int update(MYSQL mysql);
int find(MYSQL mysql);
int main()
{
MYSQL mysql;
//初始化客户端库
mysql_init(&mysql);
//连接 MySQL 服务器
if (!mysql_real_connect(&mysql,"localhost","itchenchong","wzj991010","stuff",0,NULL,0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&mysql));
return 1;
}
while (1)
{
int m;
printf("1、添加物资\n");
printf("2、删除物资\n");
printf("3、修改物资\n");
printf("4、查看全部物资\n");
printf("5、退出\n");
scanf("%d",&m);
if(m == 1)
{
insert(mysql);
}
else if(m == 2)
{
delete(mysql);
}
else if(m == 3)
{
update(mysql);
}
else if(m == 4)
{
find(mysql);
}
else if(m == 5)
{
break;
}
}
mysql_close(&mysql);
return 0;
}
int find(MYSQL mysql)
{
char sql[300];
sprintf(sql,"select * from stuff");
if(mysql_query(&mysql, sql))
{
fprintf(stderr,"查看物资失败(原因:%s)\n",mysql_error(&mysql));
}
else
{
//查询成功
MYSQL_RES *result;
MYSQL_ROW row;
// 获取查询结果集
result = mysql_store_result(&mysql);
if(result != NULL)
{
while(row = mysql_fetch_row(result))
{
printf("%s %s %s\n", row[0], row[1], row[2]);
}
// 释放查询结果集
mysql_free_result(result);
}
}
}
int insert(MYSQL mysql)
{
//执行SQL语句
unsigned int id,num;
char *str_id,str_num;
char name[20];
char sql[300];
printf("请输入物资的id:");
scanf("%d",&id);
printf("请输入物资的名称:");
scanf("%s",name);
printf("请输入物资的数量:");
scanf("%d",&num);
sprintf(sql,"insert into stuff values(%d,\'%s\',%d)",id,name,num);
if(mysql_query(&mysql, sql))
{
fprintf(stderr,"添加物资失败(原因:%s)\n",mysql_error(&mysql));
}
else
{
uint64_t r = mysql_affected_rows(&mysql); // 显示多少行发生改变
printf("添加物资成功,共添加 %lu 种物资!\n",r);
}
}
int delete(MYSQL mysql)
{
char name[20];
char sql[100];
printf("请输入删除物资的名称:");
scanf("%s",name);
sprintf(sql,"DELETE FROM stuff WHERE name = \'%s\'",name);
//执行SQL语句
if(mysql_query(&mysql, sql))
{
//通常原因就是 SQL 语句语法错误、违背约束、没有权限、连接已断开等
fprintf(stderr,"删除物资失败(原因:%s)\n",mysql_error(&mysql));
}
else
{
uint64_t r = mysql_affected_rows(&mysql);
if(r==0)
{
printf("删除物资失败,不存在此物资!\n");
}
else
{
printf("删除成功,共删除 %lu 类物资!\n",r);
}
}
}
int update(MYSQL mysql)
{
char name[20],new[20];
char sql[100];
printf("请输入修改物资的姓名:");
scanf("%s",name);
printf("请输入新的名字");
scanf("%s",new);
sprintf(sql,"UPDATE stuff set name =\'%s\' WHERE name = \'%s\'",new,name);
//执行SQL语句
if(mysql_query(&mysql, sql))
{
//通常原因就是 SQL 语句语法错误、违背约束、没有权限、连接已断开等
fprintf(stderr,"更改名称失败(原因:%s)\n",
mysql_error(&mysql));
}
else
{
uint64_t r = mysql_affected_rows(&mysql);
if(r==0)
{
printf("修改名称失败,无此物资!\n");
}
else
{
printf("修改成功,共修改 %lu 类物资!\n",r);
}
}
}