Разное

Postgresql создать таблицу: PostgreSQL | Создание и удаление таблиц

Содержание

PostgreSQL : Документация: 12: CREATE TABLE : Компания Postgres Professional

Необязательное предложение INHERITS определяет список таблиц, от которых новая таблица будет автоматически наследовать все столбцы. Родительские таблицы могут быть обычными или сторонними таблицами.

При использовании INHERITS создаётся постоянная связь дочерней таблицы с родительскими. Изменения схемы в родительских таблицах обычно также отражаются в дочерних, и по умолчанию при чтении родительских таблиц в результат включаются данные дочерней таблицы.

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

Ограничения CHECK объединяются вместе по сути так же, как и столбцы: если несколько родительских таблиц и/или определение новой таблицы содержат одноимённые ограничения CHECK, этим ограничениям должны соответствовать одинаковые выражения проверки, в противном случае произойдёт ошибка. В случае совпадения выражения, эти ограничения с данным выражением объединяются в одно. При этом ограничения со свойством NO INHERIT в родительской таблице исключаются из рассмотрения. Заметьте, что безымянное ограничение CHECK в новой таблице никогда не сливается с другими, так как для него всегда выбирается уникальное имя.

Параметры STORAGE для столбца так же копируются из родительских таблиц.

Если столбец в родительской таблице является столбцом идентификации, это свойство не наследуется. Если требуется, в дочерней таблице этот столбец можно объявить столбцом идентификации.

Создаёт таблицу в виде секции указанной родительской таблицы. Таблицу можно создать либо как секцию для определённых значений (используя FOR VALUES), либо как секцию по умолчанию (используя DEFAULT). Это указание неприемлемо для таблиц, секционируемых по хешу. В создаваемую секцию копируются все индексы, ограничения и пользовательские триггеры уровня строк.

Здесь указание_границ_секции должно соответствовать методу и ключу секционирования родительской таблицы и не должно конфликтовать с другой существующей секцией того же родителя. Вариант указания с IN используется для секционирования по спискам, тогда как вариант с FROM и TO для секционирования по диапазонам, а с WITH — для секционирования по хешу.

выражение_границ_секции — любое выражение без переменных (подзапросы, оконные, агрегатные и возвращающие множества функции в нём не допускаются). Его тип данных должен подходить для соответствующего столбца в ключе секционирования. Это выражение вычисляется единожды во время создания таблицы, поэтому в нём могут вызываться даже изменчивые функции, как например CURRENT_TIMESTAMP.

При создании секции с разбиением по спискам возможно указать, что столбец ключа разбиения может содержать NULL, включив в список секции NULL. Однако у отдельно взятой родительской таблицы может быть не больше одной такой секции. Для диапазонных секций NULL задать нельзя.

При создании диапазонной секции нижняя граница, задаваемая во FROM, включается в диапазон, а верхняя граница, задаваемая в TO — исключается. То есть, значения, задаваемые в списке FROM, являются допустимыми значениями соответствующих столбцов ключа разбиения для этой секции, а значения в списке TO — нет. Заметьте, что это утверждение должно восприниматься с учётом правил сравнения строк таблицы (см. Подраздел 9.23.5). Например, с разбиением PARTITION BY RANGE (x,y), секция с границами FROM (1, 2) TO (3, 4) примет x=1 с любым значением y>=2, x=2 с любым y, отличным от NULL, и x=3 с любым y<4.

Специальные значения MINVALUE и MAXVALUE могут использоваться при создании диапазонной секции для указания, что нижняя или верхняя граница для значений столбца отсутствует. Например, секция, определённая с указанием FROM (MINVALUE) TO (10), будет принимать любые значения меньше 10, а секция, определённая с указанием FROM (10) TO (MAXVALUE), — любые значения, которые больше или равны 10.

При создании диапазонной секции с более чем одним столбцом может также иметь смысл использовать MAXVALUE в определении нижней границы, а MINVALUE — верхней. Например, секция, определённая с указанием FROM (0, MAXVALUE) TO (10, MAXVALUE), будет принимать любые строки, в которых первый столбец ключа разбиения больше 0 и меньше или равен 10. Подобным образом, секция, определённая с указанием FROM ('a', MINVALUE) TO ('b', MINVALUE), будет принимать строки, в которых первый столбец ключа разбиения начинается с «a».

Заметьте, что если для одного столбца в границе секции задаётся MINVALUE или MAXVALUE, то же значение должно применяться и для всех последующих столбцов. Например, граница (10, MINVALUE, 0) будет некорректной; допустимая граница: (10, MINVALUE, MINVALUE).

Также заметьте, что для некоторых типов элементов, таких как timestamp, наряду с другими значениями допускается значение «infinity» (бесконечность). Оно отличается от вариантов MINVALUE и MAXVALUE, которые на самом деле не обозначают значения, которые можно сохранить, а просто говорят о том, это значение не ограничено. MAXVALUE можно воспринимать как значение, которое больше любого другого, включая «бесконечность», а MINVALUE меньше любого другого значения, включая «минус бесконечность». Таким образом, диапазон FROM ('infinity') TO (MAXVALUE) не будет пустым, а будет принимать ровно одно значение — «infinity».

С указанием DEFAULT таблица присоединяется к родительской таблице как секция по умолчанию. Для таблиц, разбиваемых по хешу, это указание не поддерживается. Ключ разбиения, не попадающий ни в одну из секций данного родителя, будет отправлен в секцию по умолчанию.

Когда у таблицы есть секция по умолчанию (DEFAULT) и к ней добавляется новая секция, требуется просканировать секцию по умолчанию и убедиться в том, что она не содержит строки, которые должны относиться к новой секции. Если она содержит большое количество строк, это сканирование может быть длительным. Сканирование не будет выполняться, если секция по умолчанию является сторонней таблицей или в ней есть ограничение, гарантирующее отсутствие в этой секции строк, подлежащих перемещению в новую секцию.

При создании секции с разбиением по хешу должен задаваться модуль и остаток. Модулем должно быть положительное число, а остатком неотрицательное число, меньшее модуля. Обычно при начальной настройке таблицы с секционированием по хешу нужно выбрать модуль, равный количеству секций, и назначить каждой секции этот модуль и разные остатки (см. примеры ниже). Однако секциям можно назначить и разные модули, с условием, что модули, назначенные секциям таблицы, разбиваемой по хешу, являются делителями следующих больших модулей. Это позволяет постепенно увеличивать число секций, не производя полное перемещение всех данных. Например, предположим, что у вас есть таблица, разбиваемая по хешу на 8 секций, для каждой из которых назначен модуль 8, и возникла необходимость увеличить число секций до 16. Вы можете отсоединить одну из секций по модулю 8, создать две новые секции по модулю 16, покрывающих ту же часть пространства ключа (одну с остатком, равным остатку отсоединённой секции, а вторую с остатком, равным тому же остатку плюс 8), и вновь наполнить их данными. Затем вы можете повторять эту операцию (возможно, позже) для следующих секций по модулю 8, пока таковых не останется. Хотя и при таком подходе может потребоваться перемещать большие объёмы данных на каждом этапе, это всё же лучше, чем создавать абсолютно новую таблицу и перемещать все данные сразу.

В секции должны содержаться столбцы с теми же именами и типами, что и в секционированной таблице, к которой она относится. Изменение имён и типов столбцов в секционируемой таблице будет автоматически распространяться во все секции. Ограничения CHECK будут наследоваться автоматически всеми секциями, но для отдельных секций могут быть заданы дополнительные ограничения CHECK; дополнительные ограничения с теми же именами и условиями, как в родительской таблице, будут объединены с родительским ограничением. Также независимо для каждой секции могут быть заданы значения по умолчанию. Но заметьте, что значение по умолчанию, заданное на уровне секции, не будет действовать при добавлении строк через секционированную таблицу.

Строки, добавляемые в секционированную таблицу, будут автоматически перенаправляться в соответствующую секцию. Если подходящей секции не найдётся, произойдёт ошибка.

Такие операции, как TRUNCATE, обычно затрагивают и саму таблицу, и каскадно распространяются на все дочерние секции, но могут также выполняться в отдельных секциях. Заметьте, что для удаления секции с помощью DROP TABLE требуется установить блокировку ACCESS EXCLUSIVE в родительской таблице.

PostgreSQL : Документация: 11: CREATE TABLE : Компания Postgres Professional

Необязательное предложение INHERITS определяет список таблиц, от которых новая таблица будет автоматически наследовать все столбцы. Родительские таблицы могут быть обычными или сторонними таблицами.

При использовании INHERITS создаётся постоянная связь дочерней таблицы с родительскими. Изменения схемы в родительских таблицах обычно также отражаются в дочерних, и по умолчанию при чтении родительских таблиц в результат включаются данные дочерней таблицы.

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

Ограничения CHECK объединяются вместе по сути так же, как и столбцы: если несколько родительских таблиц и/или определение новой таблицы содержат одноимённые ограничения CHECK, этим ограничениям должны соответствовать одинаковые выражения проверки, в противном случае произойдёт ошибка. В случае совпадения выражения, эти ограничения с данным выражением объединяются в одно. При этом ограничения со свойством NO INHERIT в родительской таблице исключаются из рассмотрения. Заметьте, что безымянное ограничение CHECK в новой таблице никогда не сливается с другими, так как для него всегда выбирается уникальное имя.

Параметры STORAGE для столбца так же копируются из родительских таблиц.

Если столбец в родительской таблице является столбцом идентификации, это свойство не наследуется. Если требуется, в дочерней таблице этот столбец можно объявить столбцом идентификации.

Создаёт таблицу в виде секции указанной родительской таблицы. Таблицу можно создать либо как секцию для определённых значений (используя FOR VALUES), либо как секцию по умолчанию (используя DEFAULT). Это указание неприемлемо для таблиц, секционируемых по хешу. В создаваемую секцию копируются все индексы, ограничения и пользовательские триггеры уровня строк.

Здесь указание_границ_секции должно соответствовать методу и ключу секционирования родительской таблицы и не должно конфликтовать с другой существующей секцией того же родителя. Вариант указания с IN используется для секционирования по спискам, тогда как вариант с FROM и TO для секционирования по диапазонам, а с WITH — для секционирования по хешу.

В качестве значений, задаваемых в указании_границ_секции, принимается буквальное значение, NULL и MINVALUE или MAXVALUE. Буквальным значением должна быть либо числовая константа, приводимая к типу соответствующего столбца ключа разбиения, либо строковая константа, представляющая допустимое входное значение для этого типа.

При создании секции с разбиением по спискам возможно указать, что столбец ключа разбиения может содержать NULL, включив в список секции NULL. Однако у отдельно взятой родительской таблицы может быть не больше одной такой секции. Для диапазонных секций NULL задать нельзя.

При создании диапазонной секции нижняя граница, задаваемая во FROM, включается в диапазон, а верхняя граница, задаваемая в TO — исключается. То есть, значения, задаваемые в списке FROM, являются допустимыми значениями соответствующих столбцов ключа разбиения для этой секции, а значения в списке TO — нет. Заметьте, что это утверждение должно восприниматься с учётом правил сравнения строк таблицы (см. Подраздел 9.23.5). Например, с разбиением PARTITION BY RANGE (x,y), секция с границами FROM (1, 2) TO (3, 4) примет x=1 с любым значением y>=2, x=2 с любым y, отличным от NULL, и x=3 с любым y<4.

Специальные значения MINVALUE и MAXVALUE могут использоваться при создании диапазонной секции для указания, что нижняя или верхняя граница для значений столбца отсутствует. Например, секция, определённая с указанием FROM (MINVALUE) TO (10), будет принимать любые значения меньше 10, а секция, определённая с указанием FROM (10) TO (MAXVALUE), — любые значения, которые больше или равны 10.

При создании диапазонной секции с более чем одним столбцом может также иметь смысл использовать MAXVALUE в определении нижней границы, а MINVALUE — верхней. Например, секция, определённая с указанием FROM (0, MAXVALUE) TO (10, MAXVALUE), будет принимать любые строки, в которых первый столбец ключа разбиения больше 0 и меньше или равен 10. Подобным образом, секция, определённая с указанием FROM ('a', MINVALUE) TO ('b', MINVALUE), будет принимать строки, в которых первый столбец ключа разбиения начинается с «a».

Заметьте, что если для одного столбца в границе секции задаётся MINVALUE или MAXVALUE, то же значение должно применяться и для всех последующих столбцов. Например, граница (10, MINVALUE, 0) будет некорректной; допустимая граница: (10, MINVALUE, MINVALUE).

Также заметьте, что для некоторых типов элементов, таких как timestamp, наряду с другими значениями допускается значение «infinity» (бесконечность). Оно отличается от вариантов MINVALUE и MAXVALUE, которые на самом деле не обозначают значения, которые можно сохранить, а просто говорят о том, это значение не ограничено. MAXVALUE можно воспринимать как значение, которое больше любого другого, включая «бесконечность», а MINVALUE меньше любого другого значения, включая «минус бесконечность». Таким образом, диапазон FROM ('infinity') TO (MAXVALUE) не будет пустым, а будет принимать ровно одно значение — «infinity».

С указанием DEFAULT таблица присоединяется к родительской таблице как секция по умолчанию. Для таблиц, разбиваемых по хешу, это указание не поддерживается. Ключ разбиения, не попадающий ни в одну из секций данного родителя, будет отправлен в секцию по умолчанию.

Когда у таблицы есть секция по умолчанию (DEFAULT) и к ней добавляется новая секция, требуется просканировать секцию по умолчанию и убедиться в том, что она не содержит строки, которые должны относиться к новой секции. Если она содержит большое количество строк, это сканирование может быть длительным. Сканирование не будет выполняться, если секция по умолчанию является сторонней таблицей или в ней есть ограничение, гарантирующее отсутствие в этой секции строк, подлежащих перемещению в новую секцию.

При создании секции с разбиением по хешу должен задаваться модуль и остаток. Модулем должно быть положительное число, а остатком неотрицательное число, меньшее модуля. Обычно при начальной настройке таблицы с секционированием по хешу нужно выбрать модуль, равный количеству секций, и назначить каждой секции этот модуль и разные остатки (см. примеры ниже). Однако секциям можно назначить и разные модули, с условием, что модули, назначенные секциям таблицы, разбиваемой по хешу, являются делителями следующих больших модулей. Это позволяет постепенно увеличивать число секций, не производя полное перемещение всех данных. Например, предположим, что у вас есть таблица, разбиваемая по хешу на 8 секций, для каждой из которых назначен модуль 8, и возникла необходимость увеличить число секций до 16. Вы можете отсоединить одну из секций по модулю 8, создать две новые секции по модулю 16, покрывающих ту же часть пространства ключа (одну с остатком, равным остатку отсоединённой секции, а вторую с остатком, равным тому же остатку плюс 8), и вновь наполнить их данными. Затем вы можете повторять эту операцию (возможно, позже) для следующих секций по модулю 8, пока таковых не останется. Хотя и при таком подходе может потребоваться перемещать большие объёмы данных на каждом этапе, это всё же лучше, чем создавать абсолютно новую таблицу и перемещать все данные сразу.

В секции должны содержаться столбцы с теми же именами и типами, что и в секционированной таблице, к которой она относится. Если родитель имеет характеристику WITH OIDS, все секции должны иметь OID; родительский столбец OID будет наследоваться всеми секциями, как и любой другой столбец. Изменение имён и типов столбцов в секционируемой таблице, а также добавление или удаление столбца OID будет автоматически распространяться во все секции. Ограничения CHECK будут наследоваться автоматически всеми секциями, но для отдельных секций могут быть заданы дополнительные ограничения CHECK; дополнительные ограничения с теми же именами и условиями, как в родительской таблице, будут объединены с родительским ограничением. Также независимо для каждой секции могут быть заданы значения по умолчанию. Но заметьте, что значение по умолчанию, заданное на уровне секции, не будет действовать при добавлении строк через секционированную таблицу.

Строки, добавляемые в секционированную таблицу, будут автоматически перенаправляться в соответствующую секцию. Если подходящей секции не найдётся, произойдёт ошибка.

Такие операции, как TRUNCATE, обычно затрагивают и саму таблицу, и каскадно распространяются на все дочерние секции, но могут также выполняться в отдельных секциях. Заметьте, что для удаления секции с помощью DROP TABLE требуется установить блокировку ACCESS EXCLUSIVE в родительской таблице.

Postgres Pro Standard : Документация: 12: CREATE TABLE : Компания Postgres Professional

Необязательное предложение INHERITS определяет список таблиц, от которых новая таблица будет автоматически наследовать все столбцы. Родительские таблицы могут быть обычными или сторонними таблицами.

При использовании INHERITS создаётся постоянная связь дочерней таблицы с родительскими. Изменения схемы в родительских таблицах обычно также отражаются в дочерних, и по умолчанию при чтении родительских таблиц в результат включаются данные дочерней таблицы.

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

Ограничения CHECK объединяются вместе по сути так же, как и столбцы: если несколько родительских таблиц и/или определение новой таблицы содержат одноимённые ограничения CHECK, этим ограничениям должны соответствовать одинаковые выражения проверки, в противном случае произойдёт ошибка. В случае совпадения выражения, эти ограничения с данным выражением объединяются в одно. При этом ограничения со свойством NO INHERIT в родительской таблице исключаются из рассмотрения. Заметьте, что безымянное ограничение CHECK в новой таблице никогда не сливается с другими, так как для него всегда выбирается уникальное имя.

Параметры STORAGE для столбца так же копируются из родительских таблиц.

Если столбец в родительской таблице является столбцом идентификации, это свойство не наследуется. Если требуется, в дочерней таблице этот столбец можно объявить столбцом идентификации.

Создаёт таблицу в виде секции указанной родительской таблицы. Таблицу можно создать либо как секцию для определённых значений (используя FOR VALUES), либо как секцию по умолчанию (используя DEFAULT). Это указание неприемлемо для таблиц, секционируемых по хешу. В создаваемую секцию копируются все индексы, ограничения и пользовательские триггеры уровня строк.

Здесь указание_границ_секции должно соответствовать методу и ключу секционирования родительской таблицы и не должно конфликтовать с другой существующей секцией того же родителя. Вариант указания с IN используется для секционирования по спискам, тогда как вариант с FROM и TO для секционирования по диапазонам, а с WITH — для секционирования по хешу.

выражение_границ_секции — любое выражение без переменных (подзапросы, оконные, агрегатные и возвращающие множества функции в нём не допускаются). Его тип данных должен подходить для соответствующего столбца в ключе секционирования. Это выражение вычисляется единожды во время создания таблицы, поэтому в нём могут вызываться даже изменчивые функции, как например CURRENT_TIMESTAMP.

При создании секции с разбиением по спискам возможно указать, что столбец ключа разбиения может содержать NULL, включив в список секции NULL. Однако у отдельно взятой родительской таблицы может быть не больше одной такой секции. Для диапазонных секций NULL задать нельзя.

При создании диапазонной секции нижняя граница, задаваемая во FROM, включается в диапазон, а верхняя граница, задаваемая в TO — исключается. То есть, значения, задаваемые в списке FROM, являются допустимыми значениями соответствующих столбцов ключа разбиения для этой секции, а значения в списке TO — нет. Заметьте, что это утверждение должно восприниматься с учётом правил сравнения строк таблицы (см. Подраздел 9.23.5). Например, с разбиением PARTITION BY RANGE (x,y), секция с границами FROM (1, 2) TO (3, 4) примет x=1 с любым значением y>=2, x=2 с любым y, отличным от NULL, и x=3 с любым y<4.

Специальные значения MINVALUE и MAXVALUE могут использоваться при создании диапазонной секции для указания, что нижняя или верхняя граница для значений столбца отсутствует. Например, секция, определённая с указанием FROM (MINVALUE) TO (10), будет принимать любые значения меньше 10, а секция, определённая с указанием FROM (10) TO (MAXVALUE), — любые значения, которые больше или равны 10.

При создании диапазонной секции с более чем одним столбцом может также иметь смысл использовать MAXVALUE в определении нижней границы, а MINVALUE — верхней. Например, секция, определённая с указанием FROM (0, MAXVALUE) TO (10, MAXVALUE), будет принимать любые строки, в которых первый столбец ключа разбиения больше 0 и меньше или равен 10. Подобным образом, секция, определённая с указанием FROM ('a', MINVALUE) TO ('b', MINVALUE), будет принимать строки, в которых первый столбец ключа разбиения начинается с «a».

Заметьте, что если для одного столбца в границе секции задаётся MINVALUE или MAXVALUE, то же значение должно применяться и для всех последующих столбцов. Например, граница (10, MINVALUE, 0) будет некорректной; допустимая граница: (10, MINVALUE, MINVALUE).

Также заметьте, что для некоторых типов элементов, таких как timestamp, наряду с другими значениями допускается значение «infinity» (бесконечность). Оно отличается от вариантов MINVALUE и MAXVALUE, которые на самом деле не обозначают значения, которые можно сохранить, а просто говорят о том, это значение не ограничено. MAXVALUE можно воспринимать как значение, которое больше любого другого, включая «бесконечность», а MINVALUE меньше любого другого значения, включая «минус бесконечность». Таким образом, диапазон FROM ('infinity') TO (MAXVALUE) не будет пустым, а будет принимать ровно одно значение — «infinity».

С указанием DEFAULT таблица присоединяется к родительской таблице как секция по умолчанию. Для таблиц, разбиваемых по хешу, это указание не поддерживается. Ключ разбиения, не попадающий ни в одну из секций данного родителя, будет отправлен в секцию по умолчанию.

Когда у таблицы есть секция по умолчанию (DEFAULT) и к ней добавляется новая секция, требуется просканировать секцию по умолчанию и убедиться в том, что она не содержит строки, которые должны относиться к новой секции. Если она содержит большое количество строк, это сканирование может быть длительным. Сканирование не будет выполняться, если секция по умолчанию является сторонней таблицей или в ней есть ограничение, гарантирующее отсутствие в этой секции строк, подлежащих перемещению в новую секцию.

При создании секции с разбиением по хешу должен задаваться модуль и остаток. Модулем должно быть положительное число, а остатком неотрицательное число, меньшее модуля. Обычно при начальной настройке таблицы с секционированием по хешу нужно выбрать модуль, равный количеству секций, и назначить каждой секции этот модуль и разные остатки (см. примеры ниже). Однако секциям можно назначить и разные модули, с условием, что модули, назначенные секциям таблицы, разбиваемой по хешу, являются делителями следующих больших модулей. Это позволяет постепенно увеличивать число секций, не производя полное перемещение всех данных. Например, предположим, что у вас есть таблица, разбиваемая по хешу на 8 секций, для каждой из которых назначен модуль 8, и возникла необходимость увеличить число секций до 16. Вы можете отсоединить одну из секций по модулю 8, создать две новые секции по модулю 16, покрывающих ту же часть пространства ключа (одну с остатком, равным остатку отсоединённой секции, а вторую с остатком, равным тому же остатку плюс 8), и вновь наполнить их данными. Затем вы можете повторять эту операцию (возможно, позже) для следующих секций по модулю 8, пока таковых не останется. Хотя и при таком подходе может потребоваться перемещать большие объёмы данных на каждом этапе, это всё же лучше, чем создавать абсолютно новую таблицу и перемещать все данные сразу.

В секции должны содержаться столбцы с теми же именами и типами, что и в секционированной таблице, к которой она относится. Изменение имён и типов столбцов в секционируемой таблице будет автоматически распространяться во все секции. Ограничения CHECK будут наследоваться автоматически всеми секциями, но для отдельных секций могут быть заданы дополнительные ограничения CHECK; дополнительные ограничения с теми же именами и условиями, как в родительской таблице, будут объединены с родительским ограничением. Также независимо для каждой секции могут быть заданы значения по умолчанию. Но заметьте, что значение по умолчанию, заданное на уровне секции, не будет действовать при добавлении строк через секционированную таблицу.

Строки, добавляемые в секционированную таблицу, будут автоматически перенаправляться в соответствующую секцию. Если подходящей секции не найдётся, произойдёт ошибка.

Такие операции, как TRUNCATE, обычно затрагивают и саму таблицу, и каскадно распространяются на все дочерние секции, но могут также выполняться в отдельных секциях. Заметьте, что для удаления секции с помощью DROP TABLE требуется установить блокировку ACCESS EXCLUSIVE в родительской таблице.

Визуализируем разработку БД PostgreSQL / Хабр

Ни для кого не секрет, что проектирование структуры БД является одной из основных и порой очень трудозатратных задач при разработке любого ПО, работающего с данными. Все мы так или иначе проектируем БД, пытаясь представить себе схему взаимосвязей таблиц, а зачастую рисуем, визуализируем структуру БД, прежде чем перенести ее в СУБД. Для моделирования баз данных MySQL есть MySQL Workbench, поставляемый разработчиком, для MS SQL есть Database Diagrams; я до недавнего времени пользовался Dia, а кто-то, может быть, использует для этих целей MS Visio. Но для PostgreSQL я не встречал ни одного адекватного решения, которое позволяло бы максимально просто и точно перенести наброски структуры БД в код ее создания в самой СУБД.

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

Итак… (текст, много картинок)

Хочу представить вам opensource продукт, распространяемый по лицензии GNU General Public License 3, под названием pgModeler.

Автор официально заявляет, что его продукт (приближенный перевод):

  1. Прост в использовании

    Легко создавать и редактировать модели БД с помощью простого и интуитивно понятного интерфейса;
  2. Поддерживает различные версии PostgreSQL

    Смоделируйте БД один раз, а затем просто экспортируйте в свою версию СУБД. В состав pgModeler входят методы генерации кода, которые дают возможность Вашим моделям быть выгруженными для различных версий PostgreSQL;

  3. Кроссплатформенный

    Написанный с помощью Qt, pgModeler может быть скомпилирован для Windows, Linux и MacOSX. Скрипты сборки легко конфигурабельны, что помогает разрешить специфические зависимости в каждой системе;

  4. Может быть функционально расширен с помощью плагинов

    Если Вам понадобится какой-то дополнительный функционал, то Вы легко сможете реализовать его в виде плагина к pgModeler. Шаблон плагина и документация любезно включена в сборку;
  5. Является открытым ПО
    Ссылка на исходный код, расположенный на гитхабе, видна на официальном сайте невооруженным глазом.

Вы все (кроме самых любопытных, которые уже сходили по ссылке на официальную страницу), наверное, спросите, чем же уникален этот продукт?

Давайте посмотрим (картинки кликабельны).

Что ж, на вид все очень даже вкусно, но так ли это на самом деле? Предлагаю создать тестовую базу.

Для начала необходимо зарегистрировать новое подключение к СУБД в настройках (Меню->Edit->Configurations->Connections):

Добавим новую роль для нашей тестовой БД. Для этого в древовидном представлении справа необходимо вызвать контекстное меню от самой БД:

Базу автоматически создавать не будем:


да, ID для роли придется добавить вручную.

Далее добавляем новую схему:

Давайте обусловимся, что в БД у нас будут храниться информация о товарах на складах. Без движений, без остатков, просто реализуем принадлежность товара к определенному складу.

Создаем новую таблицу. Это можно сделать, например, из контекстного меню, вызванного от рабочей области (клетчатое поле):

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

После принятия всех параметров таблицы она отобразится в рабочей области:

Создаем таблицу товаров:


Не стоит создавать колонку для связи двух таблиц. Конструктор это сделает за нас.

Для связи двух таблиц предусмотрено несколько типов отношений:

Создаем отношение 1-ко-Многим:

На схеме оно будет выглядеть вот так:

Теперь мы можем выгрузить нашу схему в файл-скрипт создания, в файл-картинку или напрямую в СУБД:

а также посмотреть (без возможности изменить) скрипт создания БД для любой из поддерживаемых версий СУБД в нативном формате и в формате XML (в контекстном меню от базы данных в древовидной структуре справа):

Честно говоря, исходный код можно увидеть для каждой сущности базы данных, будь то роль, схема, база данных или просто таблица.

В качестве заключения

Что ж, заявленные автором возможности данного ПО вполне себя оправдывают. Все очень интуитивно и просто.

Данный проект сейчас находится в версии v0.4.0-rc1 и активно развивается. Функционал достаточно богат, но возможны некоторые баги и недоработки, кои, впрочем, я пока не встретил.

Думаю, pgModeler придется по вкусу всем тем, кто выбирает для своих проектов PostgreSQL в качестве основной СУБД, и он поможет вам в моделировании и визуализации ваших баз данных.


PS: я не являюсь автором pgModeler.
PPS: c автором вы можете связаться сами.

PostgreSQL : Документация: 9.6: Глава 8. Типы данных : Компания Postgres Professional

bigintint8знаковое целое из 8 байт
bigserialserial8восьмибайтное целое с автоувеличением
bit [ (n) ] битовая строка фиксированной длины
bit varying [ (n) ]varbit [ (n) ]битовая строка переменной длины
booleanboolлогическое значение (true/false)
box прямоугольник в плоскости
bytea двоичные данные («массив байт»)
character [ (n) ]char [ (n) ]символьная строка фиксированной длины
character varying [ (n) ]varchar [ (n) ]символьная строка переменной длины
cidr сетевой адрес IPv4 или IPv6
circle круг в плоскости
date календарная дата (год, месяц, день)
double precisionfloat8число двойной точности с плавающей точкой (8 байт)
inet адрес узла IPv4 или IPv6
integerint, int4знаковое четырёхбайтное целое
interval [ поля ] [ (p) ] интервал времени
json текстовые данные JSON
jsonb двоичные данные JSON, разобранные
line прямая в плоскости
lseg отрезок в плоскости
macaddr MAC-адрес
money денежная сумма
numeric [ (p, s) ]decimal [ (p, s) ]вещественное число заданной точности
path геометрический путь в плоскости
pg_lsn Последовательный номер в журнале PostgreSQL
point геометрическая точка в плоскости
polygon замкнутый геометрический путь в плоскости
realfloat4число одинарной точности с плавающей точкой (4 байта)
smallintint2знаковое двухбайтное целое
smallserialserial2двухбайтное целое с автоувеличением
serialserial4четырёхбайтное целое с автоувеличением
text символьная строка переменной длины
time [ (p) ] [ without time zone ] время суток (без часового пояса)
time [ (p) ] with time zonetimetzвремя суток с учётом часового пояса
timestamp [ (p) ] [ without time zone ] дата и время (без часового пояса)
timestamp [ (p) ] with time zonetimestamptzдата и время с учётом часового пояса
tsquery запрос текстового поиска
tsvector документ для текстового поиска
txid_snapshot снимок идентификатора транзакций
uuid универсальный уникальный идентификатор
xml XML-данные

PostgreSQL | Типы данных

Типы данных в PostgreSQL

Последнее обновление: 17.03.2018

При определении таблицы для всех ее столбцов необходимо указать тип данных. Тип данных определяет диапазон значений, которые могут храниться в столбце,
сколько они будут занимать места в памяти. PostgreSQL поддерживает богатую палитру различных типов данных, среди которые условно можно разделить на подгруппы: числовые, символьные,
логические, дата и время, бинарные и ряд других.

Числовые типы данных

  • serial: представляет автоинкрементирующееся числовое значение, которое занимает 4 байта и может хранить
    числа от 1 до 2147483647. Значение данного типа образуется путем автоинкремента значения предыдущей строки. Поэтому, как правило, данный тип используется для определения идентификаторов строки.

  • smallserial: представляет автоинкрементирующееся числовое значение, которое занимает 2 байта и может хранить
    числа от 1 до 32767. Аналог типа serial для небольших чисел.

  • bigserial: представляет автоинкрементирующееся числовое значение, которое занимает 8 байт и может хранить
    числа от 1 до 9223372036854775807. Аналог типа serial для больших чисел.


  • smallint: хранит числа от -32768 до +32767. Занимает 2 байта. Имеет псевдоним int2.

  • integer: хранит числа от -2147483648 до +2147483647. Занимает 4 байта. Имеет псевдонимы int и int4.

  • bigint: хранит числа от -9223372036854775808 до +9223372036854775807. Занимает 8 байт. Имеет псевдоним int8.


  • numeric: хранит числа с фиксированной точностью, которые могут иметь до 131072 знаков в целой части и до 16383 знаков после запятой.

    Данный тип может принимать два параметра precision и scale: numeric(precision, scale).

    Параметр precision указывает на максимальное количество цифр, которые может хранить число.

    Параметр scale представляет максимальное количество цифр, которые может содержать число после запятой. Это значение должно находиться в диапазоне от 0 до значения параметра precision. По умолчанию оно равно 0.

    Например, для числа 23.5141 precision равно 6, а scale — 4.

  • decimal: хранит числа с фиксированной точностью, которые могут иметь до 131072 знаков в целой части и до 16383 знаков
    в дробной части. То же самое, что и numeric.

  • real: хранит числа с плавающей точкой из диапазона от 1E-37 до 1E+37. Занимает 4 байта. Имеет псевдоним
    float4.

  • double precision: хранит числа с плавающей точкой из диапазона от 1E-307 до 1E+308. Занимает 8 байт. Имеет псевдоним
    float8.

Примеры использования:


Id SERIAL,
TotalWeight NUMERIC(9,2),
Age INTEGER,
Surplus REAL

Типы для работы с валютой (денежными единицами)

Для работы с денежными единицами определен тип money, который может принимать значения в диапазоне от
-92233720368547758.08 до +92233720368547758.07 и занимает 8 байт.

Символьные типы

  • character(n): представляет строку из фиксированного количества символов. С помощью параметра задается задается количетво
    символов в строке. Имеет псевдоним char(n).

  • character varying(n): представляет строку из фиксированного количества символов. С помощью параметра задается задается количетво
    символов в строке. Имеет псевдоним varchar(n).

  • text: представляет текст произвольной длины.

Бинарные данные

Для хранения бинарных данных определен тип bytea. Он хранит данные в виде бинарных строк, которые представляют последовательность октетов или байт.

Типы для работы с датами и временем

  • timestamp: хранит дату и время. Занимает 8 байт. Для дат самое нижнее значение — 4713 г до н.э., самое верхнее значение —
    294276 г н.э.

  • timestamp with time zone: то же самое, что и timestamp, только добавляет данные о часовом поясе.

  • date: представляет дату от 4713 г. до н.э. до 5874897 г н.э. Занимает 4 байта.

  • time: хранит время с точностью до 1 микросекунды без указания часового пояса. Принимает значения от 00:00:00 до 24:00:00. Занимает 8 байт.

  • time with time zone: хранит время с точностью до 1 микросекунды с указанием часового пояса. Принимает значения от 00:00:00+1459 до 24:00:00-1459. Занимает 12 байт.

  • interval: представляет временной интервал. Занимает 16 байт.

Распространенные форматы дат:

Распространенные форматы времени:

  • hh:mi13:21

  • hh:mi am/pm1:21 pm

  • hh:mi:ss1:21:34

Логический тип

Тип boolean может хранить одно из двух значений: true или false.

Вместо true можно указывать следующие значения: TRUE, ‘t’, ‘true’, ‘y’, ‘yes’, ‘on’, ‘1’.

Вместо false можно указывать следующие значения: FALSE, ‘f’, ‘false’, ‘n’, ‘no’, ‘off’, ‘0’.

Типы для представления интернет-адресов

  • cidr: интернет-адрес в формате IPv4 и IPv6. Например, 192.168.0.1. Занимает от 7 до 19 байт.

  • inet: интернет-адрес в формате cidr/y, где cidr это адрес в формате IPv4 или IPv6, а /y
    количество бит в адресе (если этот параметр не указан, то используется 34 для IPv4, 128 для IPv6). Например, 192.168.0.1/24 или 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128. Занимает от 7 до 19 байт.

  • macaddr: хранит MAC-адрес. Занимает 6 байт.

  • macaddr8: хранит MAC-адрес в формате EUI-64. Занимает 8 байт.

Геометрические типы

  • point: представляет точку на плоскости в формате (x,y). Занимает 16 байт.

  • line: представляет линию неопределенной длины в формате {A,B,C}. Занимает 32 байта.

  • lseg: представляет отрезок в формате ((x1,y1),(x2,y2)). Занимает 32 байта.

  • box: представляет прямоугольник в формате ((x1,y1),(x2,y2)). Занимает 32 байта.

  • path: представляет набор содиненных точек. В формате ((x1,y1),...) путь является закрытым (первая и последняя точка соединяются линией)
    и фактически представляет многоугольник. В формате [(x1,y1),...] путь является открытым Занимает 16+16n байт.

  • polygon: представляет многоугольник в формате ((x1,y1),...). Занимает 40+16n байт.

  • circle: представляет окружность в формате <(x,y),r>. Занимает 24 байта.

Остальные типы данных

  • json: хранит данные json в текстовом виде.

  • jsonb: хранит данные json в бинарном формате.

  • uuid: хранит универсальный уникальный идентификатор (UUID), например, a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11. Занимает 32 байта.

  • xml: хранит даные в формате XML.

создать таблицу в postgreSQL — qaru

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

Загрузка…

.

PostgreSQL CREATE TABLE AS Инструкция по примерам

Резюме : в этом руководстве вы узнаете, как использовать оператор PostgreSQL CREATE TABLE AS для создания новой таблицы из набора результатов запроса.

Введение в оператор PostgreSQL CREATE TABLE

Оператор CREATE TABLE AS создает новую таблицу и заполняет ее данными, возвращаемыми запросом. Ниже показан синтаксис оператора CREATE TABLE AS :

 

CREATE TABLE имя_новой_таблицы Запрос AS;

В этом синтаксисе:

  1. Сначала укажите новое имя таблицы после предложения CREATE TABLE .
  2. Во-вторых, предоставьте запрос, набор результатов которого добавляется в новую таблицу после ключевого слова AS .

Ключевое слово TEMPORARY или TEMP позволяет создать временную таблицу:

 

CREATE TEMP TABLE new_table_name Запрос AS;

Ключевое слово UNLOGGED позволяет создать новую таблицу как незарегистрированную:

 

CREATE UNLOGGED TABLE new_table_name Запрос AS;

Столбцы новой таблицы будут иметь имена и типы данных, связанные с выходными столбцами предложения SELECT .

Если вы хотите, чтобы столбцы таблицы имели разные имена, вы можете указать новые столбцы таблицы после нового имени таблицы:

 

CREATE TABLE new_table_name (column_name_list) Запрос AS;

Если вы хотите избежать ошибки, создав новую таблицу, которая уже существует, вы можете использовать опцию IF NOT EXISTS следующим образом:

 

CREATE TABLE IF NOT EXISTS new_table_name Запрос AS;

PostgreSQL CREATE TABLE AS Примеры операторов

Для демонстрации мы будем использовать таблицы film и film_category из базы данных примеров.

Следующий оператор создает таблицу, содержащую боевики, относящиеся к первой категории.

 

СОЗДАТЬ ТАБЛИЦУ action_film AS ВЫБРАТЬ film_id, заглавие, release_year, длина, рейтинг ОТ фильм ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ film_category USING (film_id) ГДЕ category_id = 1;

Чтобы проверить создание таблицы, вы можете запросить данные из таблицы action_film :

 

SELECT * FROM action_film ЗАКАЗАТЬ ПО названию;

Чтобы проверить структуру action_film , вы можете использовать следующую команду в инструменте psql:

 

\ d action_film;

Он возвращает следующий результат:

Как ясно показано в выходных данных, имена и типы данных таблицы action_film получены из столбцов предложения SELECT .

Если предложение SELECT содержит выражения, рекомендуется переопределить столбцы, например:

 

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ film_rating (рейтинг, film_count) КАК ВЫБРАТЬ рейтинг, COUNT (film_id) ОТ фильм ГРУППА ПО рейтинг;

В этом примере оператора была создана новая таблица film_rating и заполнена сводными данными из таблицы film . В нем явно указаны имена столбцов для новой таблицы вместо использования имен столбцов из предложения SELECT .

Чтобы проверить структуру таблицы film_rating , используйте следующую команду в инструменте psql:

 

\ d film_rating

Результат:

Обратите внимание, что оператор CREATE TABLE AS аналогичен оператору SELECT INTO , но оператор CREATE TABLE AS является предпочтительным, поскольку его не путают с другими вариантами использования синтаксиса SELECT INTO в PL / pgSQL. Кроме того, оператор CREATE TABLE AS предоставляет расширенный набор функций, предлагаемых оператором SELECT INTO .

В этом руководстве вы узнали, как использовать оператор PostgreSQL CREATE TABLE AS для создания новой таблицы на основе результата запроса.

  • Было ли это руководство полезным?
  • Да Нет

.

Создать функцию для создания таблицы Postgresql

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

Загрузка…

.

PostgreSQL Python: создание таблиц

Резюме : в этом руководстве вы узнаете, как создавать новые таблицы в базе данных PostgreSQL с помощью Python.

В этом руководстве предполагается, что вы знаете, как написать оператор CREATE TABLE . Если это не так, вам следует ознакомиться с учебным курсом CREATE TABLE .

Шаги по созданию таблиц PostgreSQL в Python

Чтобы создать новую таблицу в базе данных PostgreSQL, вы выполните следующие шаги:

  1. Сначала создайте операторы CREATE TABLE.
  2. Затем подключитесь к базе данных PostgreSQL, вызвав функцию connect () . Функция connect () возвращает объект connection .
  3. Затем создайте объект cursor , вызвав метод cursor () объекта connection .
  4. После этого выполните CREATE TABLE , вызвав метод execute () объекта cursor .
  5. Наконец, закройте связь с сервером базы данных PostgreSQL, вызвав методы close () для объектов cursor и connection .

Создание таблиц в примере Python

1) Создайте программу Python

Сначала создайте новый файл с именем create_table.py .

Во-вторых, в файле create_table.py определите новую функцию с именем create_tables () .

Функция create_tables () создает четыре таблицы в базе данных поставщиков : vendors , parts , vendor_parts и part_drawings .

 

#! / Usr / bin / python импорт psycopg2 из конфигурации импорта конфигурации def create_tables (): "" "создать таблицы в базе данных PostgreSQL" "" команды = ( "" " СОЗДАТЬ ТАБЛИЦЫ поставщиков ( vendor_id СЕРИЙНЫЙ ПЕРВИЧНЫЙ КЛЮЧ, vendor_name VARCHAR (255) NOT NULL ) "" ", "" "СОЗДАТЬ ТАБЛИЦУ части ( part_id СЕРИЙНЫЙ ПЕРВИЧНЫЙ КЛЮЧ, part_name VARCHAR (255) NOT NULL ) "" ", "" " СОЗДАТЬ ТАБЛИЦУ part_drawings ( part_id ЦЕЛОЙ ПЕРВИЧНЫЙ КЛЮЧ, file_extension VARCHAR (5) НЕ NULL, drawing_data BYTEA NOT NULL, ИНОСТРАННЫЙ КЛЮЧ (part_id) ССЫЛКИ части (part_id) НА КАСКАДЕ ОБНОВЛЕНИЯ НА КАСКАДЕ УДАЛЕНИЯ ) "" ", "" " СОЗДАТЬ ТАБЛИЦУ vendor_parts ( vendor_id INTEGER NOT NULL, part_id INTEGER NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (vendor_id, part_id), ИНОСТРАННЫЙ КЛЮЧ (vendor_id) ССЫЛКИ поставщиков (vendor_id) НА КАСКАДЕ ОБНОВЛЕНИЯ НА КАСКАДЕ УДАЛЕНИЯ, ИНОСТРАННЫЙ КЛЮЧ (part_id) ССЫЛКИ части (part_id) НА КАСКАДЕ ОБНОВЛЕНИЯ НА КАСКАДЕ УДАЛЕНИЯ ) "" ") conn = Нет пытаться: # читать параметры подключения params = config () # подключиться к серверу PostgreSQL conn = psycopg2.подключить (** параметры) cur = conn.cursor () # создать таблицу одну за другой для команды в командах: cur.execute (команда) # тесная связь с сервером базы данных PostgreSQL cur.close () # зафиксировать изменения conn.commit () except (Exception, psycopg2.DatabaseError) как ошибка: печать (ошибка) Ну наконец то: если conn не равно None: conn.close () если __name__ == '__main__': create_tables ()

2) Выполните программу Python

Для выполнения программы Python используйте следующую команду:

 

python create_table.py

3) Проверьте создание таблицы

Сначала войдите на сервер базы данных PostgreSQL с помощью программы psql.

Во-вторых, используйте команду \ dt , чтобы отобразить список таблиц из базы данных поставщиков .

 

поставщиков = # \ dt Список отношений Схема | Имя | Тип | Владелец -------- + --------------- + ------- + ---------- общественный | part_drawings | стол | Postgres общественный | части | стол | Postgres общественный | vendor_parts | стол | Postgres общественный | поставщики | стол | Postgres (4 строки)

Как вы можете ясно видеть из выходных данных, у нас есть четыре таблицы, успешно созданные в базе данных поставщиков .

Если вы используете другой клиентский инструмент, например pgAdmin, вы можете просматривать таблицы через список таблиц в публичной схеме .

В этом руководстве вы шаг за шагом научились создавать новые таблицы PostgreSQL в Python с помощью адаптера базы данных psycopg.

  • Было ли это руководство полезным?
  • Да Нет

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *