社区首页 >问答首页 >如何在MYSQL程序中获得ALTER准备语句的结果?

如何在MYSQL程序中获得ALTER准备语句的结果?
EN

Stack Overflow用户
提问于 2022-06-22 12:51:05
回答 1查看 31关注 0票数 1

因此,我有这个存储过程,它检查外键是否存在,如果不存在,则创建它。我需要在一个关于600+时代的脚本中运行它。最后,它应该显示跳过、成功和失败的总和。我不知道如何从准备好的陈述中计算成功/失败的数目。

我尝试将EXECUTE stmt;存储到var中,并将其封装为IF /END/END,但没有运气。如果这有帮助的话,ALTER不必是一个预先准备好的语句。

代码语言:javascript
代码运行次数:0
复制
DELIMITER //
DROP PROCEDURE IF EXISTS `add_constraint_if_not_exists`//

SET @skippedCount = 0;
SET @successCount = 0;
SET @failCount = 0;

CREATE PROCEDURE add_constraint_if_not_exists (sourceDB varchar(64), sourceTable varchar(64), sourceColumn varchar(64), constraintName varchar(64), targetDB varchar(64), targetTable varchar(64), targetColumn varchar(64))
    BEGIN        
        IF EXISTS (
            
            SELECT *
            FROM information_schema.table_constraints
            WHERE
            table_schema = sourceDB
            AND table_name = sourceTable
            AND constraint_name = constraintName
            AND constraint_type = 'FOREIGN KEY'
            LIMIT 1
        ) THEN
            SET @skippedCount = @skippedCount + 1;
        ELSE
            SET @sql = CONCAT('ALTER TABLE `',sourceDB,'`.`',sourceTable,'` ADD CONSTRAINT ',constraintName,' FOREIGN KEY (`',sourceColumn,'`) REFERENCES `', targetDB,'`.`',targetTable, '` (`',targetColumn,'`)');

            PREPARE stmt FROM @sql;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
            
            /*
            IF @result = -1 THEN
                #SELECT @result;
                SET @failCount = @failCount + 1;
            ELSE
                SET @successCount = @successCount + 1;
            END IF
            */
        END IF;
    END //

DELIMITER ;

/*
ALTER TABLE `source_db`.`source_table` 
ADD CONSTRAINT `fk`
  FOREIGN KEY (`source_column`)
  REFERENCES `target_db`.`target_table` (`target_column`);
  */
  
CALL add_constraint_if_not_exists ('source_db', 'source_table', 'source_column', 'fk', 'target_db', 'target_table', 'target_column');

SELECT @skippedCount,@successCount,@failCount;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-22 13:55:50

您可以使用SELECT @@error_count, @@warning_count获取从最后一条语句中生成的错误或警告的数量。这适用于准备好的陈述。

演示:

代码语言:javascript
代码运行次数:0
复制
mysql> set @sql = 'select 1/0';
Query OK, 0 rows affected (0.00 sec)

mysql> prepare s from @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute s;
+------+
| 1/0  |
+------+
| NULL |
+------+
1 row in set, 1 warning (0.00 sec)

mysql> select @@error_count, @@warning_count;
+---------------+-----------------+
| @@error_count | @@warning_count |
+---------------+-----------------+
|             0 |               1 |
+---------------+-----------------+

但老实说,我根本不会做你在存储过程中做的事情。我会通过运行模式更改的一些应用程序代码来完成这个任务。除了存储过程之外,任何其他接口都会为您提供更容易获取错误和警告的函数。

不管它的价值如何,我几乎从来没有将MySQL中的存储过程用于任何目的。它们很难开发或调试,性能很差,而且缺少很多特性。

我尝试了一下,发现错误会导致程序默认退出,就像Java或其他编程语言中的异常一样。因此,它永远不会到达增量@failCount的语句。

为了解决这个问题,我尝试声明一个错误处理程序,它运行一个语句来增量@failCount,然后退出该过程:

代码语言:javascript
代码运行次数:0
复制
CREATE PROCEDURE ...
BEGIN        
  DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @failCount = @failCount + 1;
  ...

在后面的过程中,我可以假设如果它通过了EXECUTE stmt,那么它就成功了,所以我只是增加了成功计数。如果失败,就会触发退出处理程序。

代码语言:javascript
代码运行次数:0
复制
  ...
  ELSE
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
        
    SET @successCount = @successCount + 1;
  END IF;
END//

有关此主题的更多信息,请阅读https://dev.mysql.com/doc/refman/8.0/en/declare-handler.html

正如我前面所说,MySQL中的过程很难开发和调试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72721849

复制
相关文章
前端:CSS字体大小 px、em、rem的区别
1px的长度表示显示器中一个像素(pixel)的长度,实际显示的效果和显示器的 DPI(Dot Per Inch,每英寸像素数)有关,DPI越大每英寸的像素数越多,每个像素的实际大小越小。通常来说分辨率越高的屏幕 DPI也就越高,所以高分辨率屏幕显示的图标和字体都要更小一些。
渔父歌
2020/03/26
2.2K0
EM Algorithm
EM算法和之前学的都不太一样,EM算法更多的是一种思想,所以后面用几个例子讲解,同时也会重点讲解GMM高斯混合模型。
西红柿炒鸡蛋
2018/09/07
1.1K0
为什么你永远不应该在CSS中使用px来设置字体大小
代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
前端小智@大迁世界
2023/04/06
1.8K0
为什么你永远不应该在CSS中使用px来设置字体大小
EM算法
推导EM算法之前,先引用《统计学习方法》中EM算法的例子: 例1. (三硬币模型) 假设有3枚硬币,分别记作A,B,C。这些硬币正面出现的概率分别为π,p和q。投币实验如下,先投A,如果A是正面,即A=1,那么选择投B;A=0,投C。最后,如果B或者C是正面,那么y=1;是反面,那么y=0;独立重复n次试验(n=10),观测结果如下: 1,1,0,1,0,0,1,0,1,1假设只能观测到投掷硬币的结果,不能观测投掷硬币的过程。问如何估计三硬币正面出现的概率,即π,p和q的值。 解:设随机变量y是观测变量,
昱良
2018/04/08
1.1K0
EM算法
为什么不推荐使用PHPicker
iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker 的优点:
ios-lan
2020/10/23
2.6K0
为什么不推荐使用PHPicker
EM Algorithm
EM算法和之前学的都不太一样,EM算法更多的是一种思想,所以后面用几个例子讲解,同时也会重点讲解GMM高斯混合模型。
西红柿炒鸡蛋
2019/01/23
6100
MySQL为什么不推荐使用in
当然,每个具体的情况都是不同的,所以在选择查询操作符时,我们需要根据具体的需求和数据情况进行评估和测试。在优化查询性能时,我们可以使用MySQL的查询分析工具来帮助我们理解查询的执行计划和性能瓶颈,从而做出更好的决策。
程序员朱永胜
2023/09/07
3670
idea修改文字大小_为什么idea设置不了字体大小
第三步:选择Appearance选项,选择size设置自己喜欢的大小即可,我设置为14
全栈程序员站长
2022/09/27
9700
idea修改文字大小_为什么idea设置不了字体大小
EM算法
总第82篇 01|概念及原理: EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计,或极大后验概率估计。EM算法的每次迭代分两步完成:E步,求期望(expectation);M步,求极大值(maximization).所以这一算法称为期望极大算法,简称EM算法。(你看懂了吗?反正我第一次看是一脸懵。没关系接下来通过一个例子,你就能明白了。) (三硬币模型) 假设有A,B,C这些硬币正面出现的概率分别是π,p和q。进行如下掷硬币试验:先掷硬币A,根据其结果选出硬币B或C,正面选硬币B,反
张俊红
2018/04/11
1.1K0
EM算法
EM 算法
EM 算法,指的是最大期望算法(Expectation Maximization Algorithm,期望最大化算法),是一种迭代算法,在统计学中被用于寻找,依赖于不可观察的隐性变量的概率模型中,参数的最大似然估计。基本思想是首先随机取一个值去初始化待估计的参数值,然后不断迭代寻找更优的参数使得其似然函数比原来的似然函数大。
润森
2019/11/09
9410
rem与em详解
em 和 rem都是灵活、 可扩展的单位,由浏览器转换为像素值,具体取决于您的设计中的字体大小设置。 如果你使用值 1em 或 1rem,它可以被浏览器翻译成 从16px到 160px 或其他任意值。
4O4
2022/04/25
4.7K0
rem与em详解
EM算法原理总结
EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM), LDA主题模型的变分推断等等。本文就对EM算法的原理做一个总结。 1. EM算法要解决的问题 我们经常会从样本观察数据中,找出样本的模型参数。 最常用的方法就是极大化模型分布的对数似然函数。 但是在一些情况下,我们得到的观察数据有未观察到的隐含数据,此时我们未知的有隐含数据和模型参数,因而无法直接用极大化对数似然函数得到模型分布的参数。怎么办呢?这
企鹅号小编
2018/02/07
1.4K0
EM算法原理总结
EM算法原理总结
地址:http://www.cnblogs.com/pinard/p/6912636.html
机器学习算法工程师
2018/07/26
8540
EM算法原理总结
为什么 MySQL 不推荐使用 join?
作者:李博 , 链接: https://cnblogs.com/liboware/p/12740901.html
Java小咖秀
2021/04/07
2.1K0
为什么 MySQL 不推荐使用 join?
理解EM算法
EM( expectation-maximization,期望最大化)算法是机器学习中与SVM(支持向量机)、概率图模型并列的难以理解的算法,主要原因在于其原理较为抽象,初学者无法抓住核心的点并理解算法求解的思路。本文对EM算法的基本原理进行系统的阐述,并以求解高斯混合模型为例说明其具体的用法。文章是对已经在清华大学出版社出版的《机器学习与应用》一书中EM算法的讲解,对部分内容作了扩充。
SIGAI学习与实践平台
2019/01/23
1.2K0
理解EM算法
CSS 你到底有多少长度单位?
听说糙着干活的只靠 px 和 % 闯天下,不知道在看文章的你是不是也是其中一员,哈哈哈哈
全栈程序员站长
2022/06/30
4520
为什么不建议 for 循环里 String ++?
都说 StringBuilder 在处理字符串拼接上效率要强于 String,但有时候我们的理解可能会存在一定的偏差。最近我在测试数据导入效率的时候就发现我以前对 StringBuilder 的部分理解是错误的。后来我通过实践测试 + 找原理 的方式搞清楚了这块的逻辑。现在将过程分享给大家
开发者技术前线
2020/11/24
9930
为什么不建议 for 循环里 String ++?
为什么不建议你使用SELECT *
“不要使用SELECT *”几乎已经成为了MySQL使用的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用*作为查询的字段列表,更是让这条规则拥有了权威的加持。
蝉沐风
2022/08/05
2.6K2
为什么不建议你使用SELECT *
为什么不推荐Selenium写爬虫
最近在群里经常会看到有些朋友说,使用Selenium去采集网站,我看到其实内心是很难受的,哎!为什么要用Selenium呢? 我想说下自己的看法,欢迎各位大佬批评。 观点 如果可以使用 Requests 完成的,别用 Selenium 数据采集的顺序 接到一个项目或者有一个采集需求时,第一步就是明确自己的需求。经常会遇到半路改需求的事情,真的很难受。 第二步就是去分析这个网站,这个在之前有提到过 采集方案策略之App抓包 : 首先大的地方,我们想抓取某个数据源,我们要知道大概有哪些路径可以获取到数据源,基本
小歪
2018/04/04
2.2K0
为什么不推荐Selenium写爬虫
06. 为什么不 ban 猛犸?
无论是 Dota、LOL 还是其它 MOBA 游戏,比赛中均存在着 Ban Pick 机制:参与比赛的双方队伍通过数轮禁用/选取英雄后,最终确定游戏比赛的英雄阵容。
五分钟学算法
2022/02/21
5900
06. 为什么不 ban 猛犸?

相似问题

为什么em中的字体大小和重要号不覆盖px中的字体大小?

26

增加em的字体大小

11

为什么em字体大小不随字体类型而改变?

24

CSS:什么/为什么指定字体大小为字体大小:14 as /1.31em?

13

字体大小em单元继承问题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文