在使用 MySQL 數(shù)據(jù)庫的過程中,可能會遇到一種情況:當(dāng)導(dǎo)入數(shù)據(jù)時,某些列的數(shù)據(jù)類型出現(xiàn)了錯誤,而且不能直接修改這些列的數(shù)據(jù)類型,出現(xiàn)了什么問題呢?
示例代碼: CREATE TABLE `test_table` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `age` INT(11) NOT NULL, `gender` ENUM('M','F') NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
假設(shè)表格 test_table 中有一列 age 是 INT 類型的,但是在導(dǎo)入數(shù)據(jù)時,發(fā)現(xiàn) age 這一列的某些數(shù)據(jù)是字符串類型,比如 "18歲",就會出現(xiàn)以下錯誤提示:
示例代碼: ERROR 1366 (HY000) at line 2: Incorrect integer value: '18歲' for column 'age' at row 1
當(dāng)出現(xiàn)此類錯誤時,很多人的第一反應(yīng)是直接修改表結(jié)構(gòu),將 age 的數(shù)據(jù)類型改為 VARCHAR,那么做的后果就是 age 這一列的索引將面臨重建的問題,重新建立索引會極大地降低查詢效率,顯然這是不可取的。
所以,正確的解決方案是將出問題的數(shù)據(jù)先導(dǎo)入到一個臨時表中,然后再使用 CONVERT 函數(shù)將字符串類型的數(shù)據(jù)轉(zhuǎn)換成 INT 類型。示例如下:
示例代碼: CREATE TEMPORARY TABLE `temp_table` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `age` VARCHAR(20) NOT NULL, `gender` ENUM('M','F') NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOAD DATA INFILE '/tmp/test_table.txt' INTO TABLE temp_table (name, age, gender); INSERT INTO test_table (name, age, gender) SELECT name, CONVERT(age,UNSIGNED INTEGER), gender FROM temp_table; DROP TABLE temp_table;
這樣,我們就可以將臨時表中的數(shù)據(jù)轉(zhuǎn)換并插入到目標(biāo)表中,避免了修改數(shù)據(jù)類型所帶來的風(fēng)險和代價。
上一篇css的控制臺