我正在使用MySQL的Geospatial扩展。在MyISAM
表listings
中,有一个GEOMETRY
列p
和两个float
列lat
和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'
。
我尝试将p
的默认值设为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
我将p
转换回GEOMETRY
,运行查询以将索引添加到p
并收到新错误Cannot get geometry object from data you send to the GEOMETRY field
答案 0 :(得分:0)
此页面InformIT: Data Types in MySQL声称空间列不能具有DEFAULT
值,但我无法在MySQL文档中找到该信息:
3.2.3指定列默认值
对于除BLOB和TEXT类型,空间类型或具有AUTO_INCREMENT属性的列以外的所有类型,您可以指定DEFAULT def_value子句以指示...
我的5.1框中的测试显示与您相同的错误。所以声称可能是正确的。
答案 1 :(得分:0)
我遇到了类似的问题。
无法将Geo-Datatype设置为DEFAULT值。但你可以使用触发器:
按照以下方式定义您的表格:
ALTER TABLE节点ADD latlonGeo POINT NOT NULL;
创建一个触发器来设置" NOT NULL" -column:
CREATE TRIGGER default_geo_column 在INSERT ON节点之前 对于每行设置NEW.latlonGeo = GeomFromText(' POINT(0 -999)');
答案 2 :(得分: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`);