mysql編寫sql指令碼:要求表沒有主鍵,但是想查詢沒有相同值的時候才進行插入

刘大猫26發表於2024-11-03

@

目錄
  • 背景說明

背景說明

我這裡主要針對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'
);

相關文章