1

MySQLの地理空間拡張機能を使用しています。MyISAMテーブルlistingsには、列GEOMETRYp2つのfloatlatとがありlngます。の値は、pを使用して設定されUPDATE listings SET p = POINT(lat, lng);ます。

問題:ここで、列に空間インデックスを設定したいと思いますp。私が試したとき:

ALTER TABLE listings ADD SPATIAL INDEX(p);

そしてまた試した:

CREATE SPATIAL INDEX sp_index ON listings (p);

どちらの場合も、エラーが発生しますerror : All parts of a SPATIAL index must be NOT NULL

そこで(Navicatを使用して)colを作成しようとしp NOT NULLましたが、デフォルト値が必要です。これにはどのデフォルト値を使用する必要がありますか?''デフォルト値として使用してみましたが、エラーが発生しましたinvalid default value for 'p'

pasのデフォルト値を設定しようとしましPOINT(0,0)たが、エラーが発生しますBLOB/TEXT column 'p' can't have a default value

空間インデックスを作成するには、この問題にどのように取り組む必要がありますか?ありがとう!

編集

クエリを実行した後ALTER TABLE listings CHANGE p p POINT NOT NULL、実行ADD SPATIAL INDEX(p)すると奇妙なエラーが発生しますLost connection to MySQL server during query。インデックスの作成を伴わない他のクエリは正常に機能します。SELECT * FROM listings

から得られる結果SHOW CREATE TABLE listings

CREATE TABLE `listings` (
 `listing_id` int(8) NOT NULL AUTO_INCREMENT,
 `url` varchar(255) DEFAULT NULL,
 `website_city` varchar(32) DEFAULT NULL,
 `website` varchar(32) DEFAULT NULL,
 `price` int(7) DEFAULT NULL,
 `price_per_br` int(7) DEFAULT NULL,
 `bedroom` int(2) DEFAULT NULL,
 `bathroom` int(2) DEFAULT NULL,
 `fee` varchar(10) DEFAULT NULL,
 `address_1` varchar(255) DEFAULT NULL,
 `address_2` varchar(255) DEFAULT NULL,
 `city` varchar(64) DEFAULT NULL,
 `state` varchar(32) DEFAULT NULL,
 `postal` int(6) DEFAULT NULL,
 `retrival_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `post_timestamp` timestamp NULL DEFAULT NULL,
 `lat` float(10,6) DEFAULT NULL,
 `lng` float(10,6) DEFAULT NULL,
 `p` point NOT NULL,
 `description` text,
 `img_subpath` varchar(15) DEFAULT NULL,
 `photos` text,
 `reply_email` varchar(255) DEFAULT NULL,
 `phone` varchar(16) DEFAULT NULL,
 `has_dishwasher` tinyint(1) DEFAULT NULL,
 `has_laundry` tinyint(1) DEFAULT NULL,
 `has_fireplace` tinyint(1) DEFAULT NULL,
 `has_elevator` tinyint(1) DEFAULT NULL,
 `has_balcony` tinyint(1) DEFAULT NULL,
 `has_deck` tinyint(1) DEFAULT NULL,
 `has_backyard` tinyint(1) DEFAULT NULL,
 `has_parking` tinyint(1) DEFAULT NULL,
 `has_gym` tinyint(1) DEFAULT NULL,
 `has_pool` tinyint(1) DEFAULT NULL,
 `cats_ok` tinyint(1) DEFAULT NULL,
 `dogs_ok` tinyint(1) DEFAULT NULL,
 PRIMARY KEY (`listing_id`),
 KEY `lat lng` (`lat`,`lng`,`price`,`price_per_br`,`bedroom`,`bathroom`,`post_timestamp`) USING BTREE,
 KEY `spatial` (`p`(25))
) ENGINE=MyISAM AUTO_INCREMENT=589605 DEFAULT CHARSET=latin1

に変換pGEOMETRY、クエリを実行してインデックスを追加するpと、新しいエラーが発生しましたCannot get geometry object from data you send to the GEOMETRY field

4

3 に答える 3

0

このページInformIT:MySQLのデータ型は、空間列にDEFAULT値を設定できないと主張していますが、MySQLドキュメントでその情報を見つけることができません。

3.2.3列のデフォルト値の指定

AUTO_INCREMENT属性を持つBLOBおよびTEXTタイプ、空間タイプ、または列を除くすべての場合、DEFAULTdef_value句を指定して...

私の5.1ボックスでテストすると、あなたと同じエラーが表示されます。したがって、主張はおそらく正しいでしょう。

于 2012-04-06T15:54:14.760 に答える
0

私も同様の問題に直面しました。

Geo-DatatypeをDEFAULT値として設定することはできません。ただし、トリガーを使用できます。

  1. 次のようにテーブルを定義します。

    ALTERTABLEノードADDlatlonGeoPOINT NOT NULL;

  2. 「NOTNULL」列を設定するトリガーを作成します。

    各行セットのノードに挿入する前にTRIGGERdefault_geo_columnを作成しますNEW.latlonGeo=GeomFromText('POINT(0 -999)');

于 2015-04-28T17:39:52.007 に答える
0

トリックを行う必要があります!

ALTER TABLE `devices` ADD `last_location` POINT;
UPDATE `devices` SET `last_location` = ST_GeomFromText("POINT(0 0)");
ALTER TABLE `devices` MODIFY `last_location` POINT NOT NULL;
CREATE SPATIAL INDEX `location_index` ON `devices` (`last_location`);
于 2017-06-01T09:35:19.880 に答える