MySQL入门之一次函数调用执行多条语句

本文介绍如何在MySQL中使用单个字符串执行多个SQL语句。通过设置CLIENT_MULTI_STATEMENTS选项,可以实现一次发送多条语句,并逐一处理返回结果。文章提供了一个C语言示例程序,演示了这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 支持在单个字符串中指定的多语句的执行。要想与给定的连接一起使用该功能,打开连接时,必须将标志参数中的CLIENT_MULTI_STATEMENTS选项指定给mysql_real_connect()。也可以通过调用mysql_set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON),为已有的连接设置它。

常用套路:

/* Connect to server with option CLIENT_MULTI_STATEMENTS */
mysql_real_connect(..., CLIENT_MULTI_STATEMENTS);

/* Now execute multiple queries */
mysql_query(mysql,"DROP TABLE IF EXISTS test_table;\
                   CREATE TABLE test_table(id INT);\
                   INSERT INTO test_table VALUES(10);\
                   UPDATE test_table SET id=20 WHERE id=10;\
                   SELECT * FROM test_table;\
                   DROP TABLE test_table");
do
{
  /* Process all results */
  ...
  printf("total affected rows: %lld", mysql_affected_rows(mysql));
  ...
  if (!(result= mysql_store_result(mysql)))
  {
     printf(stderr, "Got fatal error processing query\n");
     exit(1);
  }
  process_result_set(result); /* client function */
  mysql_free_result(result);
} while (!mysql_next_result(mysql));

具体看代码:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <mysql/mysql.h>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <termios.h>
#include <mysql/mysql.h>

void process_result_set(MYSQL       *mysql, MYSQL_RES *result)
{
        int i =0;
        unsigned int fieldnum;
        //从结果集,获取表头信息
        MYSQL_FIELD *fields = mysql_fetch_fields(result);
        fieldnum = mysql_field_count(mysql);
        for (i=0; i<fieldnum; i++)
        {
            printf("%s\t", fields[i].name);
        }
        printf("\n");


        //从结果集, 按照行获取信息信息
        MYSQL_ROW row = NULL;
        //从结果集中一行一行的获取数据
        while (  row = mysql_fetch_row(result))
        {
            fieldnum = mysql_field_count(mysql); 
            //优化,我的行有多少列。。。。查找这样的api函数
            for (i=0; i<fieldnum; i++) //经过测试 发现 不是以0结尾的指针数组。。
            {
                printf("%s\t", row[i]);
            }
            printf("\n");
        }
}
int main()
{
    int         ret = 0, status = 0;

    MYSQL       *mysql;

    MYSQL_RES   *result;
    MYSQL_ROW   row;
    char        *query;


    mysql = mysql_init(NULL);

    mysql =mysql_real_connect(mysql, "localhost", "root", "123456", "mydb2", 0, NULL, CLIENT_MULTI_STATEMENTS);
    if (mysql == NULL)
    {
        ret = mysql_errno(mysql);
        printf("func mysql_real_connect() err\n");
        return ret;
    }
    else
    {
        printf(" ok......\n");
    }

    /* execute multiple statements */
status = mysql_query(mysql,
"DROP TABLE IF EXISTS test_table;\
CREATE TABLE test_table(id INT);\
INSERT INTO test_table VALUES(10);\
UPDATE test_table SET id=20 WHERE id=10;\
SELECT * FROM test_table;\
DROP TABLE test_table");
    if (status)
    {
        printf("Could not execute statement(s)");
        mysql_close(mysql);
        exit(0);
    }
    /* process each statement result */
    do {
            /* did current statement return data? */
            result = mysql_store_result(mysql);
            if (result)
            {
                /* yes; process rows and free the result set */

                process_result_set(mysql, result);

                mysql_free_result(result);
            }
            else /* no result set or error */
            {
                if (mysql_field_count(mysql) == 0)
                {
                    printf("%lld rows affected\n",
                    mysql_affected_rows(mysql));
                }
                else /* some error occurred */
                {
                    printf("Could not retrieve result set\n");
                    break;
                }
            }
        /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */
        if ((status = mysql_next_result(mysql)) > 0)
                printf("Could not execute statement\n");
    } while (status == 0);

    mysql_close(mysql);

}
### 如何在 MySQL 中一次执行多条 DELETE 语句 #### 方法一:使用分号分隔 SQL 语句 为了在同一事务中执行多个 `DELETE` 操作,可以在每条命令之间用分号`;`分割。这种方式适用于直接通过命令行工具或其他允许批量提交的客户端应用。 ```sql START TRANSACTION; DELETE FROM tableone WHERE userid = 'someid'; DELETE FROM tabletwo WHERE userid = 'someid'; COMMIT; ``` 这种方法确保所有操作要么全部成功完成,要么都不发生改变,从而保持数据的一致性和完整性[^1]。 #### 方法二:利用存储过程或批处理脚本 对于更复杂的场景,创建一个包含一系列 `DELETE` 命令的存储过程可能是更好的选择。这不仅简化了调用逻辑,还提高了可维护性。 ```sql DELIMITER // CREATE PROCEDURE DeleteMultipleTables(IN p_userid VARCHAR(255)) BEGIN START TRANSACTION; DELETE FROM tableone WHERE userid = p_userid; DELETE FROM tabletwo WHERE userid = p_userid; COMMIT; END// DELIMITER ; ``` 之后只需简单地调用该存储过程即可: ```sql CALL DeleteMultipleTables('specific_id'); ``` 此法同样遵循原子性的原则,并且能够方便地扩展到更多表的操作上。 #### 方法三:MyBatis 批量删除配置 如果是在应用程序层面考虑,则可以借助像 MyBatis 这样的持久层框架来实现高效的批量删除。具体做法是在 `<delete>` 标签内定义多条语句并通过参数传递要匹配的目标记录标识符。 ```xml <delete id="batchDeleteByUserId"> DELETE FROM tableone WHERE userid = #{userId}; DELETE FROM tabletwo WHERE userid = #{userId}; </delete> ``` 当触发上述映射函数时,它会自动按照指定的方式依次清除关联的数据项[^3]。 #### Python 脚本中的批量删除 Python 可以作为中介平台用于构建自定义的工作流,在其中集成对 MySQL 数据库的访问能力。下面是一个简单的例子展示怎样在一个连接周期里发送多组 `DELETE` 请求给服务器端。 ```python import mysql.connector conn = mysql.connector.connect( host='localhost', user='root', password='password', database='testdb' ) cursor = conn.cursor() try: cursor.execute(""" DELETE FROM tableone WHERE userid=%s; DELETE FROM tabletwo WHERE userid=%s; """, ('target_user', 'target_user')) finally: conn.commit() # 提交更改 cursor.close() conn.close() ``` 这段代码片段展示了如何安全有效地管理资源以及保证事务边界内的操作同步进行[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值