插入MySQL

时间:2017-03-31 11:58:57

标签: mysql database-normalization

我得到的错误是:

  

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;

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 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岁)的问题,意思是:

  1. 当SELECT语句由其自身执行 时,它可以正常工作而没有任何错误-CAST 成功将空字符串('')转换为0.000000,这得到了反映在查询结果集中。
  2. 当SELECT语句作为包含的INSERT INTO语句的一部分执行 时,CAST 失败未能将相同的空字符串转换为十进制值,并发生错误1366。

这是他正确的称呼为“模棱两可”,因为在这两种不同的用例中,CAST的工作方式不同,这充其量是令人困惑的。奇怪的是,错误消息中没有列名,并且该行被列为-1。

我认为在这里可能要解决一个错误,因为无论哪种情况,CAST都应以相同的方式工作。

幸运的是,Philip自己的答案也为我工作,所以,Philip,谢谢!