mysql:16570
From: yoku0825 <yoku0825 <yoku0825@xxxxxxxxxx>>
Date: Sun, 8 Mar 2020 12:07:53 +0900
Subject: [mysql 16570] Re: [mysql 16567] LOAD DATA INFILEでdefault値がないというエラー(Field 'SHAPE' doesn't have a default value)
yoku0825といいます。 > そこで、止む無く下記のようにGeometryフィールドをdefault NULLとし、SPATIAL > KEYも設定せずにテーブルを定義し、上記のLOAD DATA > INFILEを実行すると、エラーは発生しません。 この時、中身にはジオメトリ型のデータがちゃんと入っていそうですか? (NULLにはなっていない? NULLになってしまっているなら、渡すデータが何かしらおかしい気がしますし、 ちゃんとデータが入っているなら↓の通りになるんだと思います。 > LOAD DATA INFILEのSET構文でSpatial > Functionを使う場合にバグがあるのではないでしょうか? MySQLのユーザー定義変数(この場合は @wkt_tmp )にはデータ型がないので、 ST_GeometryFromTextが許容する以外のデータ型として一度格納されてしまっているんじゃないかなあと想像しています。 @wkt_tmpに入れている文字列を1つで良いのでサンプルとして出してもらえないでしょうか? (それで再現するならバグレポートもできるので) ところで本文中、 LOAD DATA INFILEとLOAD DATA LOCAL INFILEがちょこちょこ混じっていて、 LOAD DATA LOCAL INFILEの方は「常にエラーをIGNOREする」ような動きになる気がするのですが、 これはLOAD DATA INFILEの方でやった結果ですかね…? (でないと今度はドキュメント間違いの可能性が > With LOAD DATA LOCAL, data-interpretation and duplicate-key errors become warnings and the operation continues because the server has no way to stop transmission of the file in the middle of the operation. For duplicate-key errors, this is the same as if IGNORE is specified. IGNORE is explained further later in this section. https://dev.mysql.com/doc/refman/8.0/en/load-data.html このカラムが残っても良いなら、wkt_tmpそのものを一度カラムに格納させてしまって式デフォルトを使ってSHAPEカラムを派生させたりできないでしょうかね…。 (不要なら最後にwkt_tmpカラムをDROPしてしまう…この時式デフォルトもいじらないとエラーになりそうな予感がしてきましたが) CREATE TABLE `mesh05439` ( `OGR_FID` int(11) NOT NULL AUTO_INCREMENT, `wkt_tmp` text, `key_code` text, `mesh1_id` text, `mesh2_id` text, `mesh3_id` text, `mesh4_id` text, `mesh5_id` text, `obj_id` text, `SHAPE` geometry NOT NULL DEFAULT (ST_GeometryFromText(wkt_tmp, 2451)), PRIMARY KEY `OGR_FID` (`OGR_FID`), SPATIAL KEY `SHAPE` (`SHAPE`) ) ENGINE=InnoDB; 2020年3月4日(水) 11:49 落合 司郎 <s.ochiai@xxxxxxxxxx>: > > いつもお世話になります。 > > 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)