我得到的错误是:
ERROR 1366(HY000):DECIMAL值不正确:行'列''的'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;
任何人都可以帮我解决这个问题吗?
答案 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
答案 1 :(得分:0)
本来可以将此添加为评论,但没有所需的代表,因此我对此表示歉意。
我遇到了与Philip完全相同的问题和行为。
Philip要回答philipxy(现为1.75岁)的问题,意思是:
这是他正确的称呼为“模棱两可”,因为在这两种不同的用例中,CAST的工作方式不同,这充其量是令人困惑的。奇怪的是,错误消息中没有列名,并且该行被列为-1。
我认为在这里可能要解决一个错误,因为无论哪种情况,CAST都应以相同的方式工作。
幸运的是,Philip自己的答案也为我工作,所以,Philip,谢谢!