如何从Postgis DB中的现有表(应用新模式)创建表?


9

我有一个已启用地理空间的表格;包含世界边界。我想将其分解为不同的模式(全球,欧洲等)。我的想法是使用看起来像这样的东西:

CREATE TABLE europe.borders
  AS (SELECT *
         FROM wo_borders
         WHERE admin_lvl2='eu' ); //just an example!

从现有表创建表并考虑新模式并使其在地理空间上启用,这是正确的做法?我是否必须使用默认的postgis模板预先创建新表?

Answers:


21

通常,您可以制作一个新的地理空间表,如下所示:

SELECT *
INTO europe.borders
FROM wo_borders
WHERE admin_lvl2 = 'eu';

-- Define a primary key
ALTER TABLE europe.borders ADD PRIMARY KEY (gid);

-- Spatially enable it
SELECT Populate_Geometry_Columns('europe.borders'::regclass);

但是,通过这样做,您正在隔离数据库(对其进行规范化)。这意味着它具有冗余性,因此,如果一个表中的任何信息都有更新,则很难在另一个表中进行更新。此外,您将无法对整个世界执行查询,而只能对子区域执行查询。您可以考虑使用VIEWs来制作主表分区的虚拟表:

-- Make an index on your column used to query the view
CREATE INDEX wo_borders_admin_lvl2_idx ON wo_borders USING btree (admin_lvl2);

-- Now the view
CREATE OR REPLACE VIEW europe.borders_view AS
 SELECT *
 FROM wo_borders
 WHERE admin_lvl2 = 'eu';

-- Spatially enable it
SELECT Populate_Geometry_Columns('europe.borders_view'::regclass);

您的回答确实回答了我的问题,使我对postgresql / postgis数据库的内部工作有了更好的理解!谢谢!
尼克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.