數據修改語句概述
經過前八天的學習,我們已經掌握瞭如何從數據庫中查詢和檢索數據。但在實際應用中,數據庫不僅需要"讀"數據,更需要"寫"數據。今天我們將學習MySQL中的三大數據修改語句——INSERT(插入)、UPDATE(更新)和DELETE(刪除),這些操作能幫助我們實現對數據庫內容的增刪改功能。
注意:數據修改操作直接影響數據庫中的實際數據,錯誤的操作可能導致數據丟失或損壞。在進行本章練習前,請務必對數據庫進行備份,或在測試環境中操作。
INSERT:插入數據
基本語法格式
INSERT語句用於向表中添加新記錄,最基本的語法結構如下:
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);
完整列插入示例
假設我們有一個employees表,結構如下:
表格
|
列名 |
數據類型 |
説明 |
|
id |
INT |
員工ID(主鍵) |
|
name |
VARCHAR(50) |
員工姓名 |
|
age |
INT |
年齡 |
|
department |
VARCHAR(50) |
部門 |
|
salary |
DECIMAL(10,2) |
工資 |
向該表插入一條完整記錄:
INSERT INTO employees (id, name, age, department, salary)
VALUES (1001, '張三', 28, '技術部', 8000.00);
部分列插入示例
如果某些列允許為NULL或有默認值,可以只插入部分列:
-- 只插入必要字段,其他字段使用默認值或NULL
INSERT INTO employees (id, name, department)
VALUES (1002, '李四', '市場部');
插入多條記錄
可以通過一條INSERT語句插入多條記錄,用逗號分隔多個VALUES子句:
INSERT INTO employees (id, name, age, department, salary)
VALUES
(1003, '王五', 32, '財務部', 7500.00),
(1004, '趙六', 25, '技術部', 6800.00),
(1005, '孫七', 30, '人力資源部', 7200.00);
從查詢結果插入數據
還可以將查詢結果直接插入到表中:
-- 將技術部員工複製到新表
INSERT INTO tech_department_employees (id, name, age, salary)
SELECT id, name, age, salary FROM employees WHERE department = '技術部';
插入操作注意事項
- 數據類型匹配:插入的值必須與列的數據類型兼容
- 主鍵唯一性:主鍵字段的值不能重複
- 非空約束:帶有NOT NULL約束的列必須提供值
- 長度限制:字符串值不能超過列定義的長度
- 日期格式:日期類型的值應使用'YYYY-MM-DD'格式
UPDATE:更新數據
基本語法格式
UPDATE語句用於修改表中已存在的記錄,基本語法如下:
UPDATE 表名
SET 列1 = 值1, 列2 = 值2, ...
WHERE 條件;
單表更新示例
更新employees表中特定員工的工資:
-- 給張三漲工資
UPDATE employees
SET salary = 8500.00
WHERE id = 1001;
多列更新示例
同時更新多個字段的值:
-- 更新李四的部門和工資
UPDATE employees
SET department = '技術部', salary = 7800.00
WHERE id = 1002;
使用表達式更新
可以使用表達式計算新值:
-- 給技術部所有員工加薪10%
UPDATE employees
SET salary = salary * 1.10
WHERE department = '技術部';
基於其他表數據更新
結合子查詢,根據其他表的數據更新當前表:
-- 根據部門平均工資調整員工工資
UPDATE employees e
SET salary = (SELECT AVG(salary) * 1.05 FROM departments d WHERE d.id = e.department_id)
WHERE department_id = 3;
更新操作注意事項
- WHERE子句必不可少:如果省略WHERE子句,將更新表中的所有記錄
- 限制更新行數:可以使用LIMIT限制更新的行數
UPDATE employees SET salary = salary * 1.05 WHERE department = '技術部' LIMIT 10;
- 事務安全:重要更新操作應在事務中執行,以便必要時回滾
- 性能考慮:更新大量數據時可能影響性能,建議分批處理
DELETE:刪除數據
基本語法格式
DELETE語句用於從表中移除記錄,基本語法如下:
DELETE FROM 表名
WHERE 條件;
刪除特定記錄
刪除滿足條件的特定記錄:
-- 刪除ID為1005的員工記錄
DELETE FROM employees
WHERE id = 1005;
刪除符合條件的所有記錄
刪除滿足特定條件的所有記錄:
-- 刪除30歲以下的臨時工
DELETE FROM employees
WHERE age < 30 AND employment_type = '臨時';
限制刪除行數
使用LIMIT子句限制刪除的記錄數量:
-- 最多刪除5條市場部記錄
DELETE FROM employees
WHERE department = '市場部'
LIMIT 5;
清空表數據
如果需要刪除表中所有記錄,可以使用TRUNCATE語句(比DELETE更高效):
-- 清空employees表所有數據(無法回滾,謹慎使用)
TRUNCATE TABLE employees;
DELETE vs TRUNCATE:DELETE是逐行刪除記錄,可以帶WHERE條件,支持事務回滾;TRUNCATE是直接刪除表數據並重建表結構,速度更快但無法回滾,也不會觸發DELETE觸發器。
刪除操作注意事項
- WHERE子句:與UPDATE一樣,省略WHERE子句將刪除表中所有記錄
- 外鍵約束:如果表有外鍵關聯,需要先刪除關聯表中的相關記錄
- 事務安全:重要刪除操作應在事務中執行
- 備份優先:刪除重要數據前,建議先備份
數據操作的安全性
使用事務保障數據安全
事務可以將多個數據修改操作組合成一個邏輯單元,確保要麼全部執行成功,要麼全部失敗:
-- 開始事務
START TRANSACTION;
-- 執行一系列操作
INSERT INTO employees (...) VALUES (...);
UPDATE departments SET employee_count = employee_count + 1 WHERE id = 1;
-- 如果所有操作成功,提交事務
COMMIT;
-- 如果出現錯誤,回滾事務
-- ROLLBACK;
數據備份與恢復
在進行大量數據修改前,建議備份相關表:
-- 創建表備份
CREATE TABLE employees_backup AS SELECT * FROM employees;
-- 恢復數據(謹慎使用)
DELETE FROM employees;
INSERT INTO employees SELECT * FROM employees_backup;
使用限制條件保障安全
在生產環境中,可以通過限制條件減少誤操作風險:
-- 總是先測試查詢條件
SELECT * FROM employees WHERE department = '技術部';
-- 確認無誤後再執行更新
UPDATE employees SET salary = salary * 1.1 WHERE department = '技術部';
實踐任務
任務1:員工信息管理
創建一個employees表並完成以下操作:
- 創建表結構(包含id、name、age、department、salary等字段)
- 插入5條不同部門的員工記錄
- 將技術部所有員工的工資提高15%
- 刪除年齡超過60歲的員工記錄
- 查詢操作後的所有員工信息,驗證結果是否正確
任務2:產品庫存管理
假設有一個products表(id, name, price, stock, category):
- 向表中插入至少8種不同類別的產品
- 將所有庫存為0的產品價格降低20%
- 刪除單價低於10元且庫存為0的產品
- 使用事務完成"產品A庫存減少10個,產品B庫存增加10個"的庫存調撥操作
任務3:學生成績管理
假設有一個students表和scores表:
- 向students表插入10名學生信息
- 向scores表插入這些學生的數學和英語成績
- 將所有數學成績低於60分的學生成績更新為"需要補考"狀態
- 刪除scores表中不存在於students表中的無效成績記錄
任務4:數據修復練習
- 創建一個重要表的備份
- 故意執行一個錯誤的UPDATE操作(如不加WHERE條件)
- 使用備份恢復數據
- 編寫一個安全的UPDATE操作,包含事務和條件限制
任務5:綜合應用
設計一個小型圖書管理系統,包含books和borrowers表:
- 設計並創建表結構
- 插入測試數據
- 實現"借書"功能(更新圖書狀態,插入借閲記錄)
- 實現"還書"功能(更新圖書狀態,更新歸還日期)
- 刪除超過10年未被借閲的過期書籍記錄
總結與注意事項
第九天我們學習了MySQL中的三大數據修改語句:INSERT、UPDATE和DELETE。這些操作是數據庫管理的核心技能,但也伴隨着風險。記住以下關鍵點:
- 備份優先:重要操作前務必備份數據
- 條件明確:UPDATE和DELETE操作必須帶WHERE條件
- 事務保障:複雜操作使用事務確保數據一致性
- 測試先行:先用SELECT驗證條件是否正確
- 分批處理:大量數據修改建議分批執行
掌握這些數據修改技能後,我們就能夠完整地管理數據庫中的數據了。下一天我們將學習數據庫設計的基本原則和規範化理論,這對構建高效、可維護的數據庫系統至關重要。
思考問題:如果誤執行了一個沒有WHERE條件的UPDATE語句,如何在不影響其他已提交事務的情況下恢復數據?這個問題將在下一章中探討解決方案。