出自:
問題
在插入數據時經常存在如下需求:當此記錄不存在就插入,存在則更新而不是插入。
假如有如下表
MariaDB [learn_sql]> show create table students_sample;
CREATE TABLE `students_sample` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`STUDENT_ID` char(6) NOT NULL COMMENT '學號',
`NAME` varchar(16) NOT NULL COMMENT '姓名',
`TIME_STAMP` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '插入時間',
PRIMARY KEY (`ID`),
UNIQUE KEY `students_sample__index` (`STUDENT_ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='學生表'
表共有4列,其中一列設置了索引。
當前表中存在一條數據,如下所示
+----+------------+-----------+---------------------+
| ID | STUDENT_ID | NAME | TIME_STAMP |
+----+------------+-----------+---------------------+
| 1 | 000001 | 王二狗 | 2021-10-06 12:59:23 |
+----+------------+-----------+---------------------+
解決方案
最容易想到的方案就是先檢查此記錄是否存在,存在則更新,不存在就插入。
但是可能是這個需求太常見了,mysql數據庫本身提供解決方案。使用
ON KEY 即可。語法如下:
INSERT INTO students_sample(STUDENT_ID,NAME) VALUE('000002','上官無雪') ON DUPLICATE KEY UPDATE STUDENT_ID= '000002',NAME='牛翠花';
上面的語句當號學生不存在時則使用VALUE里面的值插入一條姓名為上官無雪的記錄,但是當號學生存在時則使用后面的語句更新此記錄。
所以上面的語句就會插入一條數據,輸出如下:
+----+------------+--------------+---------------------+
| ID | STUDENT_ID | NAME | TIME_STAMP |
+----+------------+--------------+---------------------+
| 1 | 000001 | 王二狗 | 2021-10-06 12:59:23 |
| 2 | 000002 | 上官無雪 | 2021-10-06 18:54:32 |
+----+------------+--------------+---------------------+
讓我們使用下面的語句更新一下記錄
INSERT INTO students_sample(STUDENT_ID,NAME) VALUE('000002','牛翠花') ON DUPLICATE KEY UPDATE STUDENT_ID= '000002',NAME='牛翠花';
輸入如下:
+----+------------+-----------+---------------------+
| ID | STUDENT_ID | NAME | TIME_STAMP |
+----+------------+-----------+---------------------+
| 1 | 000001 | 王二狗 | 2021-10-06 12:59:23 |
| 2 | 000002 | 牛翠花 | 2021-10-06 19:10:16 |
+----+------------+-----------+---------------------+
可見mysql檢查表是否存在,條記錄已經被更新了。
這種方法需要注意一下兩點
總結
當你遇到一個未知的問題mysql檢查表是否存在,即使你心中已經有了解決方案,也應該調研一下是否已經存在成熟的方案…百利無一害。
這個國慶很特殊啊,下了5天雨…