插入MySQL时DECIMAL值不正确

Phi*_*lip 2 mysql database-normalization

我收到的错误是:

错误 1366 (HY000):DECIMAL 值不正确:第 -1 行的列 '' 为 '0'

我正在尝试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
Run Code Online (Sandbox Code Playgroud)

这是无法在查询中插入的行select

ID          Firstname   Middlename  Lastname    Country     Latitude    Longitude
04308666-3  RICHARD     RICHARD     JUNG                    0.000000    0.000000
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

有人能帮我解决这个问题吗?

Phi*_*lip 5

我发现了问题。Latitude (VARCHAR)并且Longitude (VARCHAR)inBASE_TABLE的值为空字符串''。这导致 MySQL 由于某种原因转换为不正确的值。

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
Run Code Online (Sandbox Code Playgroud)