Усечение данных: неверное значение DATETIME '' при использовании оператора CREATE TABLE SELECT - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь создать таблицу на MariaDB 10.3 из инструкции SELECT. Таблица содержит информацию о клиенте и столбец с отсутствующими элементами для этой строки клиента. Вот пример настройки:

CREATE TABLE `customerTest` (
  `custid` int(10) NOT NULL PRIMARY KEY,
  `firstname` char(16) DEFAULT NULL,
  `lastname` char(21) DEFAULT NULL,
  `birthdate` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


INSERT INTO `customerTest` VALUES (1,'Fred',NULL,'1950-01-01'),(2,'Barney',NULL,NULL),(3,'Wilma','Flintstone',NULL);

Запрос работает, когда он не используется в операторе CREATE TABLE.

SELECT custid, customerMissingDemographics FROM (
    SELECT custid, GROUP_CONCAT(CONCAT_WS(',',FName,LName,Birthdate)) AS customerMissingDemographics FROM (
            SELECT c.custid,
            CASE WHEN firstname = '' OR firstname IS NULL THEN 'First Name' ELSE NULL END AS FName,
            CASE WHEN lastname = '' OR lastname IS NULL THEN 'Last Name' ELSE NULL END LName,
            CASE WHEN birthdate = '' OR birthdate IS NULL THEN 'Birthdate' ELSE NULL END Birthdate
            FROM `customerTest` c
            GROUP BY custid
            ) computeMissingDemographics
    GROUP BY computeMissingDemographics.custid
    ) aggregateMissingDemographics
 WHERE customerMissingDemographics <> ''

Запрос возвращает:

custid|customerMissingDemographics
------|---------------------------
     1|Last Name                  
     2|Last Name,Birthdate        
     3|Birthdate                  

Однако, если я попытаюсь использовать CREATE TABLE test для создания таблицы с результатами этого запроса, произойдет сбой с SQL Error [1292] [22001]: Data truncation: Incorrect datetime value: ''

Я попытался CAST поля в таблице computeMissingDemographics безрезультатно. Почему он это делает?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Выражение для Birthdate в SELECT не удалось определить так, как вы хотели.

При использовании

CREATE TABLE t
    SELECT ...

Вы можете по желанию добавлять / изменять столбцы / индексы. В вашем случае я предлагаю

CREATE TABLE t (
       `Birthdate` date DEFAULT NULL
               )
    SELECT ...
1 голос
/ 06 февраля 2020

Это интересно; кажется, что неявное приведение в запросе SELECT отключено, когда оно используется в запросе CREATE TABLE. Ваша проблема в этом тесте:

birthdate = ''

, поскольку '' не является допустимым значением DATE. Вы можете решить проблему путем явного приведения birthdate к CHAR перед сравнением, т.е.

CAST(birthdate AS CHAR) = ''

Демонстрация на dbfiddle

...