Mysql

查找沒有主鍵或沒有復合鍵的 MySQL 表

  • November 1, 2020

我可以很容易地從 information_schema 中找到不包含 PK 的表,但是我很難編寫邏輯來查找可能既不包含 PK 也不包含複合鍵(通過兩個 FK)的表。

我需要的是一個 for 循環,如果沒有 PRIMARY KEY 約束類型的實例,則為每個表說明,然後在其中約束類型為外鍵的至少 2 條記錄處選擇它。

老實說,我什至不知道從哪裡開始。很久沒有用 SQL 寫 FOR 循環了。

編輯:要明確這是因為需要查找沒有主鍵的表。Oracle 支持人員表示,缺少 PK 會使複製難以跟上。我使用 Hibernate,有些表是 Hibernate 用語中的“連接表”,因此沒有特定的 PK,而是該表是兩個 FK 的組合(一個組合鍵)。我想找到的是沒有的表。我想確定 Hibernate 在哪裡無法創建 PK 或 CK(通過兩個 FK),或者我的開發人員只是變得草率而沒有指定 PK。

你不需要循環,我不明白什麼是“…CK(通過兩個 FK)”。您可以使用標準的 information_schema 視圖來獲取您需要的所有資訊:

表約束

第一個將顯示所有約束,第二個將顯示所有表。任何在表中但不在約束中的表都沒有。您可以使用一個簡單的 EXCEPT 運算符:

SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
EXCEPT
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS

或使用 EXISTS:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES AS T
WHERE NOT EXISTS (SELECT NULL 
                 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
                 WHERE T.TABLE_SCHEMA = TC.TABLE_SCHEMA
                       AND
                       T.TABLE_NAME = TC.TABLE_NAME
                 );

您可以使用約束表的 WHERE 子句圍繞它建構任何您想要的邏輯。

高溫高壓

這將發現哪些表具有復合索引:

USE information_schema;
SELECT a.table_schema, a.table_name
   FROM tables a
   WHERE NOT EXISTS ( SELECT 1 
               FROM key_column_usage 
               WHERE table_schema = a.table_schema
                 AND table_name = a.table_name
                 AND ordinal_position > 1 );

(我FOREIGN_KEYs在您的問題中看不到 的相關性。您可以擁有一個包含零個、一個或多個外鍵的複合索引。)

更簡單的查詢可以檢查是否缺少任何constraint_name = 'PRIMARY'.

引用自:https://dba.stackexchange.com/questions/231011