Почему нельзя создать таблицу разделов - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать простую таблицу с разделами.

это моя команда:

CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);

это ошибка, которую я получил:

Ошибка SQL [42601]: ОШИБКА: синтаксическая ошибка в или около «PARTITION»

Невозможно разобраться с проблемой ..

Я использую PostgreSQL 9.6.3

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Вот пример автоматического создания ежемесячного раздела для версии 9.6, может быть совместим с другими версиями:

`----------Function to create partitions by system------------------
CREATE OR REPLACE FUNCTION schema.insert_function()
RETURNS TRIGGER
AS $$
DECLARE
partition_date TEXT;
partition_schema TEXT;
partition_name TEXT;
start_of_month TEXT;
end_of_month TEXT;
BEGIN
partition_date := to_char(NEW.created_dtm,'YYYY_MM');
partition_schema := 'temp';
partition_name := 'patition_name_' || partition_date;
start_of_month := to_char((NEW.created_dtm),'YYYY-MM'|| '-01');
end_of_month := to_char((NEW.created_dtm + interval '1 month'),'YYYY-MM'|| '-01');
IF NOT EXISTS
(SELECT 1
 FROM   information_schema.tables
 WHERE  table_name = partition_name
 AND table_schema = partition_schema)
THEN
EXECUTE 'CREATE TABLE '|| partition_schema ||' . '|| partition_name ||' (check (created_dtm >= ''' || start_of_month || ''' and created_dtm < ''' || end_of_month || ''' ), ' || 'LIKE master_schema.master_table  INCLUDING ALL) INHERITS (master_schema.master_table)';
EXECUTE format('ALTER TABLE %I.%I OWNER TO role1', partition_schema, partition_name);
EXECUTE format('GRANT SELECT ON TABLE %I.%I TO read_only_role', partition_schema, partition_name);
EXECUTE format('GRANT INSERT, SELECT, UPDATE, DELETE ON TABLE %I.%I TO read_write_role', partition_schema, partition_name);
EXECUTE format('CREATE INDEX ON %I.%I(column1, column2, column3)', partition_schema, partition_name);
EXECUTE format('CREATE UNIQUE INDEX ON %I.%I(column4)', partition_schema, partition_name);
........
RAISE NOTICE 'A partition has been created %.%', partition_schema, partition_name;
RAISE NOTICE 'All necessary indices are created on %.%', partition_schema, partition_name;
END IF;
EXECUTE format('INSERT INTO %I.%I VALUES($1.*)', partition_schema, partition_name) using NEW;
RETURN NULL;
END
$$
LANGUAGE plpgsql;

ALTER FUNCTION schema.insert_function()
OWNER TO super_user;

-----------------------------------------Trigger on master table--------------
CREATE TRIGGER insert_trigger
BEFORE INSERT
ON master_schema.master_table
FOR EACH ROW
EXECUTE PROCEDURE schema.insert_function();`
0 голосов
/ 09 июля 2018

«Декларативное разбиение таблиц», то есть разбиение как первоклассная функция СУБД с собственным синтаксисом, было добавлено в PostgreSQL 10 .

В более ранних версиях вы можете добиться того же эффекта, потратив немного больше усилий, используя «наследование таблиц». В руководстве есть страница, описывающая, как это сделать вручную , обобщенно:

  1. Создайте "главную" таблицу, от которой будут наследоваться все разделы.
  2. Создайте несколько «дочерних» таблиц, каждая из которых наследуется от основной таблицы.
  3. Добавьте ограничения таблиц в таблицы разделов, чтобы определить допустимые значения ключей в каждом разделе.
  4. Для каждого раздела создайте индекс для ключевого столбца (столбцов), а также любые другие индексы, которые вам могут понадобиться.
  5. Дополнительно можно определить триггер или правило для перенаправления данных, вставленных в основную таблицу, в соответствующий раздел.
  6. Убедитесь, что параметр конфигурации constraint_exclusion не отключен в postgresql.conf. Если это так, запросы не будут оптимизированы должным образом.

Чтобы сделать это проще, если вы не можете выполнить обновление до версии 10, вы можете использовать расширение, такое как pg_partman , которое предоставляет вам дополнительные функции для настройки и управления наборами разделов.

...