數據修改語句概述

經過前八天的學習,我們已經掌握瞭如何從數據庫中查詢和檢索數據。但在實際應用中,數據庫不僅需要"讀"數據,更需要"寫"數據。今天我們將學習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 = '技術部';

插入操作注意事項

  1. 數據類型匹配:插入的值必須與列的數據類型兼容
  2. 主鍵唯一性:主鍵字段的值不能重複
  3. 非空約束:帶有NOT NULL約束的列必須提供值
  4. 長度限制:字符串值不能超過列定義的長度
  5. 日期格式:日期類型的值應使用'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;

更新操作注意事項

  1. WHERE子句必不可少:如果省略WHERE子句,將更新表中的所有記錄
  2. 限制更新行數:可以使用LIMIT限制更新的行數

複製

UPDATE employees SET salary = salary * 1.05 WHERE department = '技術部' LIMIT 10;

  1. 事務安全:重要更新操作應在事務中執行,以便必要時回滾
  2. 性能考慮:更新大量數據時可能影響性能,建議分批處理

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觸發器。

刪除操作注意事項

  1. WHERE子句:與UPDATE一樣,省略WHERE子句將刪除表中所有記錄
  2. 外鍵約束:如果表有外鍵關聯,需要先刪除關聯表中的相關記錄
  3. 事務安全:重要刪除操作應在事務中執行
  4. 備份優先:刪除重要數據前,建議先備份

數據操作的安全性

使用事務保障數據安全

事務可以將多個數據修改操作組合成一個邏輯單元,確保要麼全部執行成功,要麼全部失敗:

複製

-- 開始事務
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表並完成以下操作:

  1. 創建表結構(包含id、name、age、department、salary等字段)
  2. 插入5條不同部門的員工記錄
  3. 將技術部所有員工的工資提高15%
  4. 刪除年齡超過60歲的員工記錄
  5. 查詢操作後的所有員工信息,驗證結果是否正確

任務2:產品庫存管理

假設有一個products表(id, name, price, stock, category):

  1. 向表中插入至少8種不同類別的產品
  2. 將所有庫存為0的產品價格降低20%
  3. 刪除單價低於10元且庫存為0的產品
  4. 使用事務完成"產品A庫存減少10個,產品B庫存增加10個"的庫存調撥操作

任務3:學生成績管理

假設有一個students表和scores表:

  1. 向students表插入10名學生信息
  2. 向scores表插入這些學生的數學和英語成績
  3. 將所有數學成績低於60分的學生成績更新為"需要補考"狀態
  4. 刪除scores表中不存在於students表中的無效成績記錄

任務4:數據修復練習

  1. 創建一個重要表的備份
  2. 故意執行一個錯誤的UPDATE操作(如不加WHERE條件)
  3. 使用備份恢復數據
  4. 編寫一個安全的UPDATE操作,包含事務和條件限制

任務5:綜合應用

設計一個小型圖書管理系統,包含books和borrowers表:

  1. 設計並創建表結構
  2. 插入測試數據
  3. 實現"借書"功能(更新圖書狀態,插入借閲記錄)
  4. 實現"還書"功能(更新圖書狀態,更新歸還日期)
  5. 刪除超過10年未被借閲的過期書籍記錄

總結與注意事項

第九天我們學習了MySQL中的三大數據修改語句:INSERT、UPDATE和DELETE。這些操作是數據庫管理的核心技能,但也伴隨着風險。記住以下關鍵點:

  1. 備份優先:重要操作前務必備份數據
  2. 條件明確:UPDATE和DELETE操作必須帶WHERE條件
  3. 事務保障:複雜操作使用事務確保數據一致性
  4. 測試先行:先用SELECT驗證條件是否正確
  5. 分批處理:大量數據修改建議分批執行

掌握這些數據修改技能後,我們就能夠完整地管理數據庫中的數據了。下一天我們將學習數據庫設計的基本原則和規範化理論,這對構建高效、可維護的數據庫系統至關重要。

思考問題:如果誤執行了一個沒有WHERE條件的UPDATE語句,如何在不影響其他已提交事務的情況下恢復數據?這個問題將在下一章中探討解決方案。