在 mysql 中,查找命名列的所有非外鍵實例
這個已經讓我有一段時間了!
我想執行一個查詢來檢索一個列的所有實例(
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”的列的 VIEWSELECT 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 );