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:找出無主鍵約束的表。ALTER TABLE tbl ADD PRIMARY KEY (id);id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY。pt-online-schema-change 或 gh-ost 線上操作。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;
輸出結果直接複製執行(謹慎測試後上線)。