首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

查找缺少主鍵的 MySQL 表:一條 SQL 搞定

     編輯:MySQL 資料庫相關知識

核心 SQL

SELECT
    a.`TABLE_SCHEMA` AS db_name,
    a.`TABLE_NAME`,
    a.`TABLE_ROWS`,
    a.`ENGINE`
FROM information_schema.`TABLES` a
LEFT JOIN information_schema.`TABLE_CONSTRAINTS` b
    ON a.`TABLE_NAME` = b.`TABLE_NAME`
   AND a.`TABLE_SCHEMA` = b.`TABLE_SCHEMA`
   AND b.`CONSTRAINT_TYPE` = 'PRIMARY KEY'
WHERE b.`TABLE_SCHEMA` IS NULL
  AND a.`TABLE_TYPE` = 'BASE TABLE'
  AND a.`TABLE_SCHEMA` NOT IN ('information_schema','test','mysql','performance_schema')
ORDER BY db_name, a.`TABLE_ROWS` DESC;

欄位說明

欄位含義
db_name資料庫名稱
TABLE_NAME表名稱
TABLE_ROWS預估行數(InnoDB 為近似值)
ENGINE儲存引擎

原理解析

  • information_schema.TABLES:所有基礎表。
  • information_schema.TABLE_CONSTRAINTS:約束資訊,CONSTRAINT_TYPE='PRIMARY KEY' 過濾主鍵。
  • LEFT JOIN ... WHERE b.TABLE_SCHEMA IS NULL:找出無主鍵約束的表。
  • 排除系統庫,避免誤報。
  • 按行數降序,優先處理大表。

後續處理建議

  1. 對業務核心大表優先補主鍵:ALTER TABLE tbl ADD PRIMARY KEY (id);
  2. 若無合適單欄,考慮複合主鍵或新增自增 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY。
  3. 補主鍵會鎖表,大表請用 pt-online-schema-change 或 gh-ost 線上操作。
  4. 納入 CI/CD 檢查:建表腳本必須包含主鍵,否則流水線阻擋。

一鍵生成補鍵腳本(參考)

SELECT CONCAT(
    'ALTER TABLE `', a.`TABLE_SCHEMA`, '`.`', a.`TABLE_NAME`,
    '` ADD COLUMN `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,',
    ' ADD PRIMARY KEY (`id`);'
) AS alter_sql
FROM information_schema.`TABLES` a
LEFT JOIN information_schema.`TABLE_CONSTRAINTS` b
    ON a.`TABLE_NAME` = b.`TABLE_NAME`
   AND a.`TABLE_SCHEMA` = b.`TABLE_SCHEMA`
   AND b.`CONSTRAINT_TYPE` = 'PRIMARY KEY'
WHERE b.`TABLE_SCHEMA` IS NULL
  AND a.`TABLE_TYPE` = 'BASE TABLE'
  AND a.`TABLE_SCHEMA` NOT IN ('information_schema','test','mysql','performance_schema')
ORDER BY a.`TABLE_ROWS` DESC;

輸出結果直接複製執行(謹慎測試後上線)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved