首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 表別名進階應用:解決同表自我關聯 UPDATE/DELETE、鎖定別名必要性實戰

     編輯:MySQL 綜合教學

前言

MySQL 表別名不僅簡化 SQL,更能讓同一張表在單一陳述式中扮演多重角色,解決自我關聯更新/刪除無法用標準 JOIN 處理的難題。本文實戰示範無限分類刪除時的父子關聯遞移更新。

場景:無限分類刪除遞移父級

categories 表:cat_id、parent_id(NULL 為頂層)。刪除某分類時,其子分類的 parent_id 需指向被刪除分類的父分類(祖父級)。

關鍵技巧:同表多別名 + 全部鎖定

LOCK TABLES 
  `categories` WRITE,           -- 原表
  `categories` AS `c1` WRITE,   -- 子分類角色
  `categories` AS `c2` WRITE;   -- 父分類角色

UPDATE `categories` AS `c1`, `categories` AS `c2`
SET `c1`.`parent_id` = `c2`.`parent_id`
WHERE `c1`.`parent_id` = `c2`.`cat_id`
  AND `c2`.`cat_id` = $cat_id;

DELETE FROM `categories` WHERE `cat_id` = $cat_id;

UNLOCK TABLES;

核心規則:鎖定必須包含所有別名

  • LOCK TABLES 必須列出原表 + 所有使用的別名。
  • 缺少別名鎖定 → ERROR 1100: Table 'c1' was not locked with LOCK TABLES。
  • 此為 MySQL 獨特限制,其他資料庫通常不需鎖定別名。

別名應用場景總覽

場景別名角色關鍵點
自我關聯 UPDATE來源/目標需鎖定所有別名
自我關聯 DELETE父/子避免外鍵約束衝突
同表多次 JOIN不同路徑簡化欄位引用
衍生表/子查詢中間結果提升可讀性

相關延伸閱讀

  • MySQL 外部鎖定深度了解
  • MySQL MERGE 表優點
  • 隨機獲取 MySQL 資料方法
  • 依據 MySQL 表備份
  • MySQL 清空表實現方法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved