Список разбиений в Postgres 12 - PullRequest
0 голосов
/ 07 августа 2020
CREATE TABLE countrymeasurements
(
  countrycode int NOT NULL,
  countryname character varying(30) NOT NULL,
  languagename character varying (30) NOT NULL,
  daysofoperation character varying(30) NOT NULL,
  salesparts    bigint,
  replaceparts  bigint
)
 PARTITION BY LIST(countrycode)
 (
  partition india values(1),
  partition japan values(2),
  partition china values(3),
  partition malaysia values(4)
  );

Я получаю ОШИБКА: синтаксическая ошибка около "(". Что мне здесь не хватает. Я использую postgres12

Ответы [ 2 ]

3 голосов
/ 07 августа 2020

Я не знаю, где вы нашли этот синтаксис, очевидно, не в руководстве . Как видите, там разделы создаются с использованием create table .. as partition of в Postgres:

Определите таблицу:

CREATE TABLE countrymeasurements
(
  countrycode int NOT NULL,
  countryname character varying(30) NOT NULL,
  languagename character varying (30) NOT NULL,
  daysofoperation character varying(30) NOT NULL,
  salesparts    bigint,
  replaceparts  bigint
)
PARTITION BY LIST(countrycode);

Определите разделы:

create table india 
  partition of countrymeasurements 
  for values in (1);
  
create table japan
  partition of countrymeasurements 
  for values in (2);
  
create table china
  partition of countrymeasurements 
  for values in (3);

create table malaysia
  partition of countrymeasurements 
  for values in (4);
2 голосов
/ 07 августа 2020

Добро пожаловать в stackoverflow! Обратите внимание, что если задать здесь вопросы без предварительного исследования, это может отпугнуть людей, которые в противном случае хотели бы помочь.

В этом случае я проверил и не нашел официального примера разбиения списка. Но если вы просто сократите свой оператор, он создаст таблицу, используя значения в столбце countrycode для разделения:

CREATE TABLE countrymeasurements
(
  countrycode int NOT NULL,
  countryname character varying(30) NOT NULL,
  languagename character varying (30) NOT NULL,
  daysofoperation character varying(30) NOT NULL,
  salesparts    bigint,
  replaceparts  bigint
)
 PARTITION BY LIST(countrycode)
;

Команда psql описывает таблицу показывает, что разбиение выполняется в соответствии с запросом:

psql=# \d countrymeasurements
                    Table "public.countrymeasurements"
     Column      |         Type          | Collation | Nullable | Default
-----------------+-----------------------+-----------+----------+---------
 countrycode     | integer               |           | not null |
 countryname     | character varying(30) |           | not null |
 languagename    | character varying(30) |           | not null |
 daysofoperation | character varying(30) |           | not null |
 salesparts      | bigint                |           |          |
 replaceparts    | bigint                |           |          |
Partition key: LIST (countrycode)

Затем вы можете определить разделы, как в ответе от @a_horse_with_no_name. Но некоторые примечания по использованию такой стратегии могут быть в порядке.

Примечания:

  • Когда вы просто разрешаете 4 явных раздела через список (как вы пытались), что происходит, когда значение 5 приходит?
  • В документации по адресу postgresql 12 по разделу ddl ing предлагается рассмотреть ha sh разделение вместо списка и выбрать количество разделов вместо того, чтобы полагаться на значения столбца что может выявить очень несбалансированное изобилие.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...