2013-08-26 73 views
0

經過一些在這裏搜索stackoverflow和在網絡上,我找不到我的問題的答案。我不是一個真正的SQL人才,但我試圖將表中的所有列轉換爲varchar(255)。它有大約600個列都是varchar,但大小限制各不相同。我希望他們都是255.有沒有辦法不必手動做到這一點?我使用MySQL。SQL:將所有列轉換爲VarChar(255)

謝謝!

+1

在這個MySQL,SQL服務器,什麼版本的數據庫? – dcaswell

+12

爲什麼你有一張600列的桌子? –

+0

我在MYSQL中工作,對不起沒有提及。 – user2704687

回答

2

這不是你真正需要做的。你有一些更重要的事情要做:正常化你的數據庫

現在,你有一個600列的規範化表是不可能的。至少遵循第三種正常形式規則,正確分解您的實體。之後,你將擁有一個更好的數據庫,這更容易維護。

爲此,您需要刪除當前表,因此,不需要將所有類型更改爲varchar(255),因爲在創建其他表時將修復它們。

這將是一個良好的開端爲:http://en.wikipedia.org/wiki/Database_normalization(得益於問題的意見@Tim Schmelter)

+0

你讓我好奇:我有一張桌子在第一列中有一個類別,該類別最多有599個匹配關鍵字。因此,在分類之後,其餘列每個都保存1個關鍵字。你想如何規範呢? – user2704687

+0

@ user2704687有三個表格:一個帶有類別列表,一個帶有關鍵字列表,第三個帶有category_id和keyword_id(現在您有600行,這是規範化數據庫的預期行爲)。因此,如果這種情況發生,你可以擁有600多個類別。這是一個簡單的N:M關係。 –

+1

另外,您將數據庫可視化爲excel表格:不這樣做,數據庫表格不僅僅是二維表格。 –

2

你需要從數據庫中提取數據,生成ALTER TABLE語句。

select 'alter table MyTableName modify column ' + column_name + ' varchar(255);' 
from information_schema where table_name = 'MyTableName' 

然後將此命令的結果粘貼到查詢窗口並運行它 - 確保它你想要它做的事情。先做一個備份。

或者你可以做一個大的改變語句(如果MySql不會窒息它)用逗號代替分號。

+0

我認爲用戶要求varchar(255)不適用於varchar(600)。 .. –

+0

謝謝。固定。我注意到了600號碼。 – dcaswell

+0

警告。 \t如果一列之前不是NULL,這段代碼會使它成爲NULL,這是一個意想不到的副作用。 –

2

首先,正如別人提到的那樣,您最好關閉正常化您的數據

在此期間,您可以用動態SQL這樣

DELIMITER $$ 
CREATE PROCEDURE change_to_varchar255(IN _tname VARCHAR(64)) 
BEGIN 
    SET @sql = NULL; 

    SELECT GROUP_CONCAT( 
      CONCAT_WS(' ', 'CHANGE', COLUMN_NAME, COLUMN_NAME, 'VARCHAR(255)')) 
    INTO @sql 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = _tname 
    AND DATA_TYPE = 'varchar' 
    AND CHARACTER_MAXIMUM_LENGTH < 255 
    AND TABLE_SCHEMA = SCHEMA(); 

    SET @sql = CONCAT_WS(' ', 'ALTER TABLE', _tname, @sql); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END$$ 
DELIMITER ; 

用法示例實現自己的目標:

CALL change_to_varchar255('table1'); 

這裏是SQLFiddle演示

+0

小心。如果一列之前不是NULL,這段代碼會使它成爲NULL,這是一個意想不到的副作用。 –