@
目錄
- 背景說明
背景說明
我這裡主要針對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'
);