Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So speichern Sie fehlende FLOAT-Werte mit NULL in SQL

Das Problem ist, wie MySQL ein leeres Feld interpretiert gegenüber einem fehlenden Feld . Aus der Dokumentation für LOAD DATA INFILE ...

In diesem Fall scheint MySQL es als leer zu betrachten . Sie können dies unter show warnings sehen .

mysql> show warnings;
+---------+------+------------------------------------------------------------+
| Level   | Code | Message                                                    |
+---------+------+------------------------------------------------------------+
| Warning | 1265 | Data truncated for column 'customerReviewAverage' at row 2 |
| Warning | 1265 | Data truncated for column 'customerReviewAverage' at row 3 |
+---------+------+------------------------------------------------------------+
2 rows in set (0.00 sec)

Wenn wir hingegen die nachgestellten Kommas entfernen, fehlt das Feld ...

19658847,Glanzlichter - CD,,12.99,5.0
19658856,Glanzlichter - CD,,6.99
19658865,Glanzlichter - CD,,8.99
1965886,Beach Boys '69 - CASSETTE,,6.99,4.5

Dann werden die Daten auf null gesetzt.

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1261 | Row 2 doesn't contain data for all columns |
| Warning | 1261 | Row 3 doesn't contain data for all columns |
+---------+------+--------------------------------------------+

mysql> select * from products;   
+----------+---------------------------+-------------+--------------+-----------------------+
| sku      | name                      | description | regularPrice | customerReviewAverage |
+----------+---------------------------+-------------+--------------+-----------------------+
| 19658847 | Glanzlichter - CD         | NULL        |        12.99 |                     5 |
| 19658856 | Glanzlichter - CD         | NULL        |         6.99 |                  NULL |
| 19658865 | Glanzlichter - CD         | NULL        |         8.99 |                  NULL |
|  1965886 | Beach Boys '69 - CASSETTE | NULL        |         6.99 |                   4.5 |
+----------+---------------------------+-------------+--------------+-----------------------+
4 rows in set (0.00 sec)

Machen Sie dasselbe für @customerReviewAverage wie für @description hat bei mir in MySQL 5.7 funktioniert.

LOAD DATA
  LOCAL INFILE 'product.csv'
  INTO TABLE Products
  FIELDS TERMINATED BY ','
  ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  (sku, name, @description, regularPrice, @customerReviewAverage)       
  SET description           = IF(@description='',NULL,@description),
      customerReviewAverage = IF(@customerReviewAverage='',NULL,@customerReviewAverage);

mysql> select * from products;
+----------+---------------------------+-------------+--------------+-----------------------+
| sku      | name                      | description | regularPrice | customerReviewAverage |
+----------+---------------------------+-------------+--------------+-----------------------+
| 19658847 | Glanzlichter - CD         | NULL        |        12.99 |                     5 |
| 19658856 | Glanzlichter - CD         | NULL        |         6.99 |                  NULL |
| 19658865 | Glanzlichter - CD         | NULL        |         8.99 |                  NULL |
|  1965886 | Beach Boys '69 - CASSETTE | NULL        |         6.99 |                   4.5 |
+----------+---------------------------+-------------+--------------+-----------------------+
4 rows in set (0.00 sec)