@[toc]
背景说明
我这里主要针对2处地方要进行增量执行sql:
1.新功能需要创建一张新表结构indicator_alarm_threshold
2.给菜单表和另一个表新增数据
我们现在使用的是项目启动先初始化加载init-table.sql的脚本(这里面的轻易不动了,保持原结构数据),然后还有个用于后续迭代升级的增量脚本sql,当然我们没有使用flayway技术,使用的是python安装脚本解析读取执行的。
表1-sql
-- ----------------------------
-- Table structure for indicator_alarm_threshold
-- ----------------------------
DROP TABLE IF EXISTS `indicator_alarm_threshold`;
CREATE TABLE `indicator_alarm_threshold` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ne_type_id` int(11) NULL DEFAULT NULL COMMENT '网元类型id',
`counter_code` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '指标编码,全局唯一,共十位, C->普通指标 K->计算指标 U->自定义指标',
`upper_limit_of_the_busy_time_threshold` int(11) NULL DEFAULT NULL COMMENT '忙时阈值上限',
`lower_limit_of_the_busy_time_threshold` int(11) NULL DEFAULT NULL COMMENT '忙时阈值下限',
`upper_limit_of_the_idel_time_threshold` int(11) NULL DEFAULT NULL COMMENT '闲时阈值上限',
`lower_limit_of_the_idel_time_threshold` int(11) NULL DEFAULT NULL COMMENT '闲时阈值下限',
`date_range_begin_time` datetime NULL DEFAULT NULL COMMENT '有效开始日期',
`date_range_end_time` datetime NULL DEFAULT NULL COMMENT '有效结束日期',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',
`active_state` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '激活状态【0:未激活、1:已激活】',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '指标告警阈值表' ROW_FORMAT = Compact;
注意:
一定要有DROP TABLE IF EXISTS
判断,否则万一重复执行脚本可能会报错中断安装程序。
(表没有主键,但是想查询没有相同值的时候才进行插入)模板
如果表没有主键,你可以使用 WHERE NOT EXISTS
子查询来在插入数据之前进行条件检查,确保没有相同的值存在。以下是一个示例的 SQL 插入语句:
INSERT INTO your_table (column1, column2, ...)
SELECT 'value1', 'value2', ...
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM your_table
WHERE column1 = 'value1' AND column2 = 'value2'
);
解释说明:
在上述示例中,your_table
是你的表名,column1、column2
等是你想要插入数据的列。'value1'
、'value2'
是对应列的值。
在 WHERE NOT EXISTS
子查询中,我们检查表中是否存在与要插入的值匹配的记录。如果不存在,就会执行插入操作。
请注意,FROM dual
是一个虚拟表,在这里用于提供插入语句所需的基础查询。你可以根据实际情况替换 'value1'、'value2'
和对应的列名与值。
使用这种方法,只有当表中没有与要插入的值匹配的记录时,才会执行插入操作。否则,不会插入重复的数据。
表2-原始sql长这样
INSERT INTO `t_resource` (`id`, `name`, `reskey`, `url`, `type`, `lvl`, `parent_id`) VALUES ('86', '指标告警阈值', 'alarm_indicatorThreshold', '/alarm/indicatorThreshold', 1, 8, 7);
INSERT INTO `r_role_resource` (`role_id`, `resc_id`) VALUES ('2', '86');
INSERT INTO `r_role_resource` (`role_id`, `resc_id`) VALUES ('111', '86');
表2-按照模板编写后的长这样
INSERT INTO `t_resource` (`id`, `name`, `reskey`, `url`, `type`, `lvl`, `parent_id`)
SELECT '86', '指标告警阈值', 'alarm_indicatorThreshold', '/alarm/indicatorThreshold', 1, 8, 7
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM t_resource
WHERE id = '86'
AND name = '指标告警阈值'
AND reskey = 'alarm_indicatorThreshold'
AND url = '/alarm/indicatorThreshold'
AND type = 1
AND lvl = 8
AND parent_id = 7
);
INSERT INTO `r_role_resource` (`role_id`, `resc_id`)
SELECT '2', '86'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM r_role_resource
WHERE role_id = '2'
AND resc_id = '86'
);
INSERT INTO `r_role_resource` (`role_id`, `resc_id`)
SELECT '111', '86'
FROM dual
WHERE NOT EXISTS (
SELECT * FROM r_role_resource
WHERE role_id = '111'
AND resc_id = '86'
);