1

我正在使用 MySQL 的地理空间扩展。MyISAM表中有listings1GEOMETRYp2floatlatlng。中的值p是使用 设置的UPDATE listings SET p = POINT(lat, lng);

问题:现在我想在 column 上设置一个空间索引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'

p我尝试为as设置默认值,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

我遇到了类似的问题。

无法将 Geo-Datatype 设置为 DEFAULT 值。但是您可以使用触发器:

  1. 如下定义您的表:

    ALTER TABLE 节点添加 latlonGeo POINT NOT NULL;

  2. 创建一个触发器来设置“NOT NULL”列:

    CREATE TRIGGER default_geo_column BEFORE INSERT ON Node FOR EACH ROW SET NEW.latlonGeo = GeomFromText('POINT(0 -999)');

于 2015-04-28T17:39:52.007 回答
0

此页面InformIT:MySQL 中的数据类型声称空间列不能有DEFAULT值,但我无法在 MySQL 文档中找到该信息:

3.2.3 指定列默认值

对于除 BLOB 和 TEXT 类型、空间类型或具有 AUTO_INCREMENT 属性的列之外的所有类型,您可以指定一个 DEFAULT def_value 子句来指示...

在我的 5.1 框中测试显示与您相同的错误。所以这个说法可能是正确的。

于 2012-04-06T15:54:14.760 回答
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 回答