mysql:16567
From: 落合 司郎 <落合 司郎 <s.ochiai@xxxxxxxxxx>>
Date: Wed, 4 Mar 2020 11:48:53 +0900
Subject: [mysql 16567] LOAD DATA INFILEでdefault値がないというエラー(Field 'SHAPE' doesn't have a default value)
いつもお世話になります。 WKT形式で記述されたGeometryデータを含むCSVファイルをLOAD DATA INFILEでテーブルに取り込もうとしています。 Geometryデータを取り込むGeometryフィールドにはSPATIAL KEYを設定したいため、NOT NULL制約をつける必要があり、取り込み先のテーブルを以下のようにGeometryフィールドをNOT NULL、default値を設定しないで定義しました。 #エラーが発生したときのテーブル # geometry型(NOT NULL)を含むテーブル定義 drop tables if exists mesh05439; CREATE TABLE `mesh05439` ( `OGR_FID` int(11) NOT NULL AUTO_INCREMENT, `SHAPE` geometry NOT NULL, `key_code` text, `mesh1_id` text, `mesh2_id` text, `mesh3_id` text, `mesh4_id` text, `mesh5_id` text, `obj_id` text, PRIMARY KEY `OGR_FID` (`OGR_FID`), SPATIAL KEY `SHAPE` (`SHAPE`) ) ENGINE=InnoDB; 下記に示すLOAD DATA INFILEを実行すると、CSVファイルのすべてのレコードにデータに値があっても、default値がないというエラーが発生しました。 なお、LOAD DATA INFILEで取り込むCSVファイルはtextファイルでなければならないので、CSVファイルのGeometryデータはWKTフォーマットの文字列としています。 LOAD DATA INFILEではGeometryデータをワーク変数を割り当て、SET構文でST_GeometryFromText()でGeometryフィールドに値をセットしています。 #実行したLOAD DATA INFILE # LOAD DATA INFILEで取り込むCSVファイルはtextファイルでなければならないので、 # CSVファイルではGeometryデータはWKTフォーマットの文字列とし、LOAD DATA INFILEではワーク変数を割り当て、 # SET構文でST_GeometryFromText()でGeometryフィールドに値をセットします。 LOAD DATA LOCAL INFILE 'C:******/MESH05439.csv' INTO TABLE mesh05439 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (@wkt_tmp, key_code, mesh1_id, mesh2_id, mesh3_id, mesh4_id, mesh5_id, obj_id) SET SHAPE=ST_GeometryFromText(@wkt_tmp,2451); # 発生したエラー Error Code: 1364. Field 'SHAPE' doesn't have a default value そこで、止む無く下記のようにGeometryフィールドをdefault NULLとし、SPATIAL KEYも設定せずにテーブルを定義し、上記のLOAD DATA INFILEを実行すると、エラーは発生しません。 drop tables if exists mesh05439; CREATE TABLE `mesh05439` ( `OGR_FID` int(11) NOT NULL AUTO_INCREMENT, `SHAPE` geometry default NULL, `key_code` text, `mesh1_id` text, `mesh2_id` text, `mesh3_id` text, `mesh4_id` text, `mesh5_id` text, `obj_id` text, PRIMARY KEY `OGR_FID` (`OGR_FID`) ) ENGINE=InnoDB; GeometryフィールドにはSPATIAL KEYを設定したいので、取り込んだ後に、ALTER TABLEでGeometryフィールドをNOT NULLに、また、SPATIAL KEYを追加する手順としています。 ALTER TABLE `mesh05439` CHANGE COLUMN `SHAPE` `SHAPE` GEOMETRY NOT NULL , ADD SPATIAL KEY `SHAPE` (`SHAPE`); ところで、LOAD DATA INFILEでワーク変数を割り当て、SET構文でテーブルのNOT NULLで定義されたフィールドに値を設定することは、Geometry型以外のフィールドならばSpatial Functionを含まない計算式なら問題なくできます。 LOAD DATA INFILEのSET構文でSpatial Functionを使う場合にバグがあるのではないでしょうか? 実行環境: OS:Windows 8.0 64ビット MySQL:Ver.8.0.12 GPL版 Workbench:Ver.6.3.9
-> 16567 2020-03-04 11:48 [落合 司郎 <s.ochiai@] LOAD DATA INFILEでdefault値がないというエラー(Field 'SHAPE' doesn't have a default value) 16570 2020-03-08 12:07 ┗[yoku0825 <yoku0825@x] Re: [mysql 16567] LOAD DATA INFILEでdefault値がないというエラー(Field 'SHAPE' doesn't have a default value)