經過一些在這裏搜索stackoverflow和在網絡上,我找不到我的問題的答案。我不是一個真正的SQL人才,但我試圖將表中的所有列轉換爲varchar(255)。它有大約600個列都是varchar,但大小限制各不相同。我希望他們都是255.有沒有辦法不必手動做到這一點?我使用MySQL。SQL:將所有列轉換爲VarChar(255)
謝謝!
經過一些在這裏搜索stackoverflow和在網絡上,我找不到我的問題的答案。我不是一個真正的SQL人才,但我試圖將表中的所有列轉換爲varchar(255)。它有大約600個列都是varchar,但大小限制各不相同。我希望他們都是255.有沒有辦法不必手動做到這一點?我使用MySQL。SQL:將所有列轉換爲VarChar(255)
謝謝!
這不是你真正需要做的。你有一些更重要的事情要做:正常化你的數據庫
現在,你有一個600列的規範化表是不可能的。至少遵循第三種正常形式規則,正確分解您的實體。之後,你將擁有一個更好的數據庫,這更容易維護。
爲此,您需要刪除當前表,因此,不需要將所有類型更改爲varchar(255),因爲在創建其他表時將修復它們。
這將是一個良好的開端爲:http://en.wikipedia.org/wiki/Database_normalization(得益於問題的意見@Tim Schmelter)
你讓我好奇:我有一張桌子在第一列中有一個類別,該類別最多有599個匹配關鍵字。因此,在分類之後,其餘列每個都保存1個關鍵字。你想如何規範呢? – user2704687
@ user2704687有三個表格:一個帶有類別列表,一個帶有關鍵字列表,第三個帶有category_id和keyword_id(現在您有600行,這是規範化數據庫的預期行爲)。因此,如果這種情況發生,你可以擁有600多個類別。這是一個簡單的N:M關係。 –
另外,您將數據庫可視化爲excel表格:不這樣做,數據庫表格不僅僅是二維表格。 –
你需要從數據庫中提取數據,生成ALTER TABLE語句。
select 'alter table MyTableName modify column ' + column_name + ' varchar(255);'
from information_schema where table_name = 'MyTableName'
然後將此命令的結果粘貼到查詢窗口並運行它 - 確保它你想要它做的事情。先做一個備份。
或者你可以做一個大的改變語句(如果MySql不會窒息它)用逗號代替分號。
我認爲用戶要求varchar(255)不適用於varchar(600)。 .. –
謝謝。固定。我注意到了600號碼。 – dcaswell
警告。 \t如果一列之前不是NULL,這段代碼會使它成爲NULL,這是一個意想不到的副作用。 –
首先,正如別人提到的那樣,您最好關閉正常化您的數據。
在此期間,您可以用動態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演示
小心。如果一列之前不是NULL,這段代碼會使它成爲NULL,這是一個意想不到的副作用。 –
在這個MySQL,SQL服務器,什麼版本的數據庫? – dcaswell
爲什麼你有一張600列的桌子? –
我在MYSQL中工作,對不起沒有提及。 – user2704687