PostgreSQL中ASSERT的实用示例请求:断言指定查询行数为10
我太懂这种翻遍文档找不到简单示例的难受了!不同数据库对断言的实现差异不小,我给你几个主流数据库的可运行示例,直接复制就能测试:
PostgreSQL 原生ASSERT示例
PostgreSQL原生支持ASSERT命令,你可以用匿名代码块来实现断言逻辑:
-- 1. 创建测试表(如果不存在) CREATE TABLE IF NOT EXISTS my_table ( id SERIAL PRIMARY KEY, my_col INT ); -- 2. 插入10条my_col=3的数据,再加2条其他数据做测试 INSERT INTO my_table (my_col) VALUES (3), (3), (3), (3), (3), (3), (3), (3), (3), (3), (1), (2); -- 3. 执行断言:验证my_col=3的行数等于10 DO $$ DECLARE row_count INT; BEGIN -- 先获取查询行数 SELECT COUNT(*) INTO row_count FROM my_table WHERE my_col = 3; -- 断言:如果行数不等于10,抛出错误 ASSERT row_count = 10, '查询行数不符合预期!预期10行,实际' || row_count || '行'; END $$;
如果断言失败(比如你把插入的3改成9条),脚本会直接抛出错误:ERROR: 查询行数不符合预期!预期10行,实际9行,后续代码不会执行。
MySQL 自定义断言实现
MySQL没有原生的ASSERT命令,但可以用SIGNAL结合存储过程实现类似效果:
-- 1. 创建测试表 CREATE TABLE IF NOT EXISTS my_table ( id INT AUTO_INCREMENT PRIMARY KEY, my_col INT ); -- 2. 插入测试数据 INSERT INTO my_table (my_col) VALUES (3), (3), (3), (3), (3), (3), (3), (3), (3), (3), (4), (5); -- 3. 创建断言存储过程 DELIMITER // CREATE PROCEDURE assert_my_table_row_count() BEGIN DECLARE row_count INT; SELECT COUNT(*) INTO row_count FROM my_table WHERE my_col = 3; -- 如果行数不符合预期,抛出自定义错误 IF row_count != 10 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = CONCAT('查询行数不符合预期!预期10行,实际', row_count, '行'); END IF; END // DELIMITER ; -- 4. 执行断言 CALL assert_my_table_row_count();
断言失败时,会返回错误信息:Error Code: 1644. 查询行数不符合预期!预期10行,实际9行。
SQL Server 断言实现
SQL Server可以用THROW语句来抛出断言错误:
-- 1. 创建测试表 CREATE TABLE IF NOT EXISTS my_table ( id INT IDENTITY(1,1) PRIMARY KEY, my_col INT ); -- 2. 插入测试数据 INSERT INTO my_table (my_col) VALUES (3), (3), (3), (3), (3), (3), (3), (3), (3), (3), (6), (7); -- 3. 执行断言逻辑 DECLARE @row_count INT; SELECT @row_count = COUNT(*) FROM my_table WHERE my_col = 3; IF @row_count != 10 BEGIN -- 抛出自定义错误:错误号50001是用户自定义范围的错误号 THROW 50001, '查询行数不符合预期!预期10行,实际行数不对', 1; END
断言失败时,会抛出错误:Msg 50001, Level 16, State 1, Line 14 查询行数不符合预期!预期10行,实际行数不对,脚本终止执行。
内容的提问来源于stack exchange,提问作者rxmnnxfpvg
相关产品推荐
相关产品推荐

