2017-03-31 36 views
0

當我得到的錯誤是:不正確的十進制值插入的MySQL

ERROR 1366(HY000):不正確的十進制值: '0' 列 '' 在行 -1

我正在嘗試normalize數據庫並確保數據類型正確。將數據從BASE_TABLE插入到名爲Inventors的新表中。

這是我用來插入的查詢。如果我從select查詢手動取手動,它可以正確插入到Inventors表中。

但是,像這樣運行查詢,我立即得到上述錯誤。

INSERT INTO 
    Inventors(ID,Firstname,Middlename,Lastname,Country,Latitude,Longitude) 
SELECT DISTINCT 
    Inventor_ID as ID, 
    Firstname, 
    Middlename, 
    Lastname, 
    Country, 
    cast(Latitude as decimal(11,6)) as Latitude, 
    cast(Longitude as decimal(11,6)) as Longitude 
FROM 
    BASE_TABLE 

這裏是一個失敗的select查詢插入行:

ID   Firstname Middlename Lastname Country  Latitude Longitude 
04308666-3 RICHARD  RICHARD  JUNG     0.000000 0.000000 

Inventors創建查詢:

CREATE TABLE `Inventors` (
    `ID` varchar(55) NOT NULL DEFAULT '', 
    `Firstname` varchar(255) DEFAULT NULL, 
    `Middlename` varchar(255) DEFAULT NULL, 
    `Lastname` varchar(255) DEFAULT NULL, 
    `Country` varchar(255) DEFAULT NULL, 
    `Latitude` decimal(11,8) DEFAULT NULL, 
    `Longitude` decimal(11,8) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

BASE_TABLE創建查詢:

CREATE TABLE `BASE_TABLE` (
    `Firstname` varchar(255) DEFAULT NULL, 
    `Middlename` varchar(255) DEFAULT NULL, 
    `Lastname` varchar(255) DEFAULT NULL, 
    `Country` varchar(255) DEFAULT NULL, 
    `Zipcode` varchar(255) DEFAULT NULL, 
    `Latitude` varchar(255) DEFAULT NULL, 
    `Longitude` varchar(255) DEFAULT NULL, 
    `InvSeq` int(11) DEFAULT NULL, 
    `Patent` varchar(255) DEFAULT NULL, 
    `AppYear` year(4) DEFAULT NULL, 
    `ApplyYear` year(4) DEFAULT NULL, 
    `PubYear` year(4) NOT NULL, 
    `AppDate` varchar(255) DEFAULT NULL, 
    `Assignee` varchar(255) DEFAULT NULL, 
    `AsgNum` varchar(255) DEFAULT NULL, 
    `Class` varchar(255) DEFAULT NULL, 
    `Coauthor` varchar(255) DEFAULT NULL, 
    `Invnum` varchar(255) DEFAULT NULL, 
    `Invnum_N` varchar(255) DEFAULT NULL, 
    `Record_ID` varchar(255) NOT NULL, 
    `Inventor_ID` varchar(255) DEFAULT NULL, 
    `Match_Level` tinyint(4) DEFAULT NULL, 
    `Company_ID` varchar(255) DEFAULT NULL, 
    `Classification` varchar(255) DEFAULT NULL, 
    `Citing` mediumint(9) DEFAULT NULL, 
    `Cited` mediumint(9) DEFAULT NULL, 
    PRIMARY KEY (`Record_ID`), 
    KEY `Inventor_ID` (`Inventor_ID`), 
    KEY `Patent` (`Patent`), 
    KEY `Patent_2` (`Patent`,`Inventor_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

任何人都可以幫助我解決這個問題嗎?

+2

很明顯,'cast()'不起作用。您需要查看這些列中的值。 –

+0

請看看編輯過的帖子。我從'select'查詢中添加了三個值。 – Philip

+0

。 。只有一個值會導致你失敗​​。 –

回答

0

我發現了這個問題。 Latitude (VARCHAR)Longitude (VARCHAR)BASE_TABLE的值爲空字符串''。這導致MySQL由於某種原因轉換爲不正確的值。

我解決了這個問題,在select查詢中替換了空字符串NULL(見下文)。

INSERT INTO 
    Inventors 
SELECT DISTINCT 
    Inventor_ID as ID, 
    Firstname, 
    Middlename, 
    Lastname, 
    Country, 
    IF(Latitude='',NULL,CAST(Latitude as decimal(11,6))) as Latitude, 
    IF(Longitude='',NULL,CAST(Longitude as decimal(11,6))) as Longitude 
FROM 
    BASE_TABLE 
+0

「出於某種原因」?什麼十進制數字是''? – philipxy

+0

是@philipxy,由於某些原因,當接收空字符串時,該轉換函數返回0.000000而不是空字符串。但是由於某些原因它仍然不能保存,儘管0.000000是一個小數,我猜想。 – Philip

+0

爲什麼投射時會返回一個空字符串? [spec](https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html)表示傳遞一個表示指定類型的字符串。空字符串不是數字表達式。所以你得到一個錯誤。 – philipxy