Mysql

在 mysql 中,查找命名列的所有非外鍵實例

  • December 23, 2018

這個已經讓我有一段時間了!

我想執行一個查詢來檢索一個列的所有實例(information_schema我猜來自 ),這些實例是或不是外鍵。

現在,讓我退後一點,解釋一下我的真正需要。我有一個相當大的數據庫來處理公司資訊。現在,我希望能夠刪除(或更新)客戶記錄,並讓所有相關的外鍵都受到 CASCADE 的影響。現在,如果沒有在任何地方適當地設置外鍵約束,那麼一些記錄可能會成為孤立的。

所以,我想先查詢一下我的專欄。現在讓我們假設該列的所有實例都具有相同的名稱“mycol”。

我注意到了這張桌子REFERENTIAL_CONSTRAINTS,但被嚇到了;)。我看到的一個直接約束(請原諒雙關語)是:該欄位CONSTRAINT_NAME填充了類似的名稱customer_ibfk_1,因為該項目上的 FK 約束的命名留給 mysql 作為預設處理。該表沒有“REFERENCED_COLUMN”欄位,所以我很難過。

請提供任何幫助!

這就是我最終想出的。當然,我願意接受這裡的 DBA 祖父的輸入/改進!但就目前而言,這種方法正在為我提供所需的資訊。

USE INFORMATION_SCHEMA;

獲取至少有一個外鍵引用“mytable”中的列的所有表

SELECT TABLE_NAME, COUNT(*) AS reference_count 
FROM REFERENTIAL_CONSTRAINTS 
WHERE CONSTRAINT_SCHEMA = 'mydb' 
   AND REFERENCED_TABLE_NAME = 'mytable' GROUP BY TABLE_NAME;

獲取在名為“mycolumn”的列上至少有一個外鍵的所有表

SELECT TABLE_NAME 
FROM KEY_COLUMN_USAGE 
WHERE CONSTRAINT_SCHEMA = 'mydb' 
   AND COLUMN_NAME = 'mycolumn' 
   AND REFERENCED_TABLE_SCHEMA IS NOT NULL;

獲取具有名為“mycolumn”的任何列的所有表。WHERE 子句中的子查詢AND (SELECT Table_Type FROM TABLES WHERE table_schema = 'mydb' AND TABLE_NAME = COLUMNS.TABLE_NAME)是必需的,否則它還會返回任何具有名為“mycolumn”的列的 VIEW

SELECT TABLE_NAME 
FROM COLUMNS 
WHERE 
   TABLE_SCHEMA = 'mydb' 
   AND COLUMN_NAME = 'mycolumn' 
   AND (SELECT Table_Type 
       FROM TABLES WHERE table_schema = 'mydb' 
       AND TABLE_NAME = COLUMNS.TABLE_NAME) = 'BASE TABLE';

現在,使用前面的 2 個查詢,我們可以獲得具有名為“mycolumn”但其中“mycolumn”不是外鍵的列的任何表。請注意,此過濾不會考慮 PRIMARY KEY,並且還會返回“mycolumn”是 PRIMARY KEY 的任何表。

SELECT TABLE_NAME 
FROM COLUMNS 
WHERE TABLE_SCHEMA = 'mydb' 
   AND COLUMN_NAME = 'mycolumn' 
   AND (SELECT Table_Type 
       FROM TABLES 
       WHERE table_schema = 'mydb' 
           AND TABLE_NAME = COLUMNS.TABLE_NAME) = 'BASE TABLE' 
   AND TABLE_NAME NOT IN
       (SELECT TABLE_NAME 
       FROM KEY_COLUMN_USAGE 
       WHERE CONSTRAINT_SCHEMA = 'mydb' 
           AND COLUMN_NAME = 'mycolumn' 
           AND REFERENCED_TABLE_SCHEMA IS NOT NULL
       );

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