2012-08-26 11 views
3

有人可以幫我解決我如何在phpmyadmin中運行一個命令,它將刪除數據庫中所有具有前綴「test_」的列。MYSQL命令刪除數據庫中的所有列,其前綴test_要在phpmyadmin中運行

我對MYSQL不是很好,所以我甚至不知道從哪裏開始,任何幫助將不勝感激。

非常感謝。 :)

+0

您沒有使用正確的術語,使其不清楚您想要做什麼。你想擦除以「test_」開頭的所有記錄,或者是否真的要刪除*列*(字段)。最後一個是你在問什麼,但沒有任何意義。 – ApplePie

+0

我想刪除以「test_」前綴開頭的列是不可能的?謝謝。 –

回答

5

要從表中刪除一列,請使用語法:

alter table <tablename> drop column <columnname> 

要查找所有在一個表中,與TEST_啓動數據庫列,請執行以下操作:

select column_name 
from INFORMATION_SCHEMA.columns 
where table_name = <table_name> and 
     table_schema = <schema_name> and 
     left(column_name, 5) = 'test_' -- not using "like" because '_' is a wildcard char 

如果您手動執行此操作,我會建議運行以下查詢,然後將結果粘貼到mysql查詢界面:

select concat('alter table ', table_name, ' drop column ', column_name) 
from INFORMATION_SCHEMA.columns 
where table_name = <table_name> and 
     schema_name = <schema_name> and 
     left(column_name, 5) = 'test_' 

通過運行查詢,返回結果,然後將每行作爲查詢運行,您可以在代碼中執行類似的操作。

+0

謝謝,但有沒有辦法我可以做到這一點批量,如從數據庫中的所有表中刪除列的前綴test_,而不是從一個特定的表中刪除列?非常感謝。 –

+0

在此解決方案中,您只需刪除「table_name = 」部分。多個命令將被返回。只需全部粘貼即可。或者,您還可以使用@ eggyal的解決方案,將光標移到表格上並使用準備好的語句。 –

+0

感謝您的幫助!他也是一個很好的答案,但是我發現你更容易理解,因爲我是MySQL的noob,所以我很感謝你:) –

2

如果您實際上想要下降您的架構中的列,您將需要從MySQL的information schema tables動態生成必要的SQL命令。雖然可以在使用SQL prepared statements的MySQL存儲過程中做到這一點,下面我將對此進行演示,但您可能會發現,使用您的首選開發語言(您沒有在您的問題中提及)更容易實現/理解:

DELIMITER ;; 

CREATE PROCEDURE dropMatchingColumns(IN pattern VARCHAR(64)) 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE cur CURSOR FOR 
    SELECT CONCAT(
       'ALTER TABLE `', REPLACE(TABLE_NAME, '`', '``'), '` ', 
       GROUP_CONCAT(
       'DROP COLUMN `', REPLACE(COLUMN_NAME, '`', '``'), '`' 
       ) 
      ) 
    FROM  INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE pattern AND TABLE_SCHEMA = DATABASE() 
    GROUP BY TABLE_NAME 
    ; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur; 

    read_loop: LOOP 
    FETCH cur INTO @sql; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    END LOOP; 

    CLOSE cur; 
END;; 

DELIMITER ; 

通過定義此過程,只需要CALL dropMatchingColumns('test\_%');即可從當前數據庫中刪除前綴爲test_的所有列。

+0

感謝您的幫助! :) –

2

如果你有MySQL工作臺,那麼你可以刪除多列,只需做一個質量選擇,並告訴工作臺做選擇的列

0

我想解釋或簡化這個答案對於那些像我這樣的批量刪除誰遇到了麻煩。

我在我的數據庫'demo'中的所有表中刪除名爲'seq'的列時遇到了問題。

您可以創建格式化使用這樣的事情每個表的命令選擇:

Select concat('alter table ', table_name, ' drop column ', 'seq;') 
from (select table_name 
from INFORMATION_SCHEMA.tables 
where table_name = table_name and 
table_schema = 'demo') as t 

這在「演示」數據庫中創建每個表的alter table命令。

您必須選擇結果並將其複製並粘貼回查詢編輯器。

這是一個兩步過程,但如果您必須多次執行此操作,請將這些命令保存在文本文件中以便稍後再次運行。

相關問題