2012-11-18 61 views
0

我正在從舊系統開發一個新系統。新系統使用mysql和java。我想從數量減少的表格開始。當我刪除一個表時,可以說X,我怎樣才能使所有對X的引用都被刪除,所以如果表Y有表X的FK,那麼在表Y上FK和FK中使用的列也會被刪除?mysql drop table and cascade delete to all references to the table

簡化例如:

CREATE TABLE `Y` (
    `yID` int(11) NOT NULL AUTO_INCREMENT, 
    `yName` varchar(50) NOT NULL, 
    ... 
    ) ENGINE=InnoDB; 

CREATE TABLE `user` (
    `userID` int(11) NOT NULL AUTO_INCREMENT, 
    `userName` varchar(50) NOT NULL, 
    `givenName` varchar(50) DEFAULT NULL, 
    `sourceYID` int(11) NOT NULL, 
    CONSTRAINT `USER_FK_sourceYID` FOREIGN KEY (`sourceYID`) REFERENCES `Y` (`yID`) 
    ) ENGINE=InnoDB; 

我想最好發出一個命令,將

DROP TABLE `Y` 

,並在用戶表

remove the CONSTRAINT `USER_FK_sourceYID` 
    remove the column sourceYID 
    remove any KEY/INDEX definitions based on sourceYID as well if included (not 
     included in this example) 
+0

我不清楚,在這個階段,我將使用減少的現有數據庫結構,但我已經導出了沒有任何數據的sql文件的轉儲。我希望有一種自動的方法來刪除引用表中的外鍵和外鍵所涉及的列。 – melutovich

回答

0

如果你有外鍵,那麼你不能刪除父表,外鍵關係將不允許它。要做到這一點,你應該這樣做:

  • 刪除所有的子記錄,有兩種方法:使用ON DELETE CASCADE外鍵選項,或使用多表DELETE語句。
  • 如果存在,則刪除外鍵。
  • 刪除父表。
+0

我還不清楚,在這個階段,我將使用減少的現有數據庫結構,但我已經導出了沒有任何數據的sql文件的轉儲。我希望有一種自動的方法來刪除引用表中的外鍵和外鍵所涉及的列。 – melutovich

+0

你可以添加更多的信息(你有什麼和你想要的)? – Devart

+0

我已經在問題上添加了一個示例。 – melutovich

0

沒有一個命令可以做到這一點。處理這個問題最簡單的方法是刪除約束,然後刪除父表。沒有限制,你可以自由地做到這一點。

ALTER TABLE `user` DROP FOREIGN KEY `USER_FK_sourceYID`; 
DROP TABLE `Y`; 

刪除列會自動將它從它所屬的任何索引中刪除。即使它是一個複合索引,它也會留下索引和其餘列。下面是一些假設的例子指標,我們將看看會發生什麼,當我們刪除列:

CREATE INDEX y1 ON `user` (sourceYID); 
CREATE INDEX y2 ON `user` (userID, sourceYID); 
CREATE INDEX y3 ON `user` (sourceYID, userID); 

ALTER TABLE `user` DROP COLUMN `sourceYID`; 

結果是指數y1沒有了,都y2y3減少到僅包含單列索引用戶ID列:

SHOW CREATE TABLE `user`\G 

CREATE TABLE `user` (
    `userID` int(11) NOT NULL AUTO_INCREMENT, 
    `userName` varchar(50) NOT NULL, 
    `givenName` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`userID`), 
    KEY `y2` (`userID`), 
    KEY `y3` (`userID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

因此這兩個現在都是相同的索引,你應該運行pt-duplicate-key-checker來分析你的架構這樣的情況。

+0

謝謝,有一些幫助。舊的系統大約有175張桌子,我在新系統上的第一次傳球只有20張,所以我正在尋找一種方法來實現這一點。我向我的新僱主發送了一封電子郵件,詢問是否有任何可能有助於舊系統使用的命名約定。 – melutovich