色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

mysql導(dǎo)入過來的不能改類型

錢琪琛2年前10瀏覽0評論

在使用 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)險和代價。