Linux高级编程——数据库(触发器、导入导出、C语言调用)

触发器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 函数实现。

通用步骤:

  1. 连接数据库
  2. 执行 SQL语句
  3. 断开连接
#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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值