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.
Автор официально заявляет, что его продукт (приближенный перевод):
- Прост в использовании
Легко создавать и редактировать модели БД с помощью простого и интуитивно понятного интерфейса; - Поддерживает различные версии PostgreSQL
Смоделируйте БД один раз, а затем просто экспортируйте в свою версию СУБД. В состав pgModeler входят методы генерации кода, которые дают возможность Вашим моделям быть выгруженными для различных версий PostgreSQL; - Кроссплатформенный
Написанный с помощью Qt, pgModeler может быть скомпилирован для Windows, Linux и MacOSX. Скрипты сборки легко конфигурабельны, что помогает разрешить специфические зависимости в каждой системе; - Может быть функционально расширен с помощью плагинов
Если Вам понадобится какой-то дополнительный функционал, то Вы легко сможете реализовать его в виде плагина к pgModeler. Шаблон плагина и документация любезно включена в сборку; - Является открытым ПО
Ссылка на исходный код, расположенный на гитхабе, видна на официальном сайте невооруженным глазом.
Вы все (кроме самых любопытных, которые уже сходили по ссылке на официальную страницу), наверное, спросите, чем же уникален этот продукт?
Давайте посмотрим (картинки кликабельны).
Что ж, на вид все очень даже вкусно, но так ли это на самом деле? Предлагаю создать тестовую базу.
Для начала необходимо зарегистрировать новое подключение к СУБД в настройках (Меню->Edit->Configurations->Connections):
Добавим новую роль для нашей тестовой БД. Для этого в древовидном представлении справа необходимо вызвать контекстное меню от самой БД:
Базу автоматически создавать не будем:
да, ID для роли придется добавить вручную.
Далее добавляем новую схему:
Давайте обусловимся, что в БД у нас будут храниться информация о товарах на складах. Без движений, без остатков, просто реализуем принадлежность товара к определенному складу.
Создаем новую таблицу. Это можно сделать, например, из контекстного меню, вызванного от рабочей области (клетчатое поле):
В конструкторе создания таблицы можно сразу указать все необходимые колонки, ограничения, триггеры, правила и индексы:
После принятия всех параметров таблицы она отобразится в рабочей области:
Создаем таблицу товаров:
Не стоит создавать колонку для связи двух таблиц. Конструктор это сделает за нас.
Для связи двух таблиц предусмотрено несколько типов отношений:
Создаем отношение 1-ко-Многим:
На схеме оно будет выглядеть вот так:
Теперь мы можем выгрузить нашу схему в файл-скрипт создания, в файл-картинку или напрямую в СУБД:
а также посмотреть (без возможности изменить) скрипт создания БД для любой из поддерживаемых версий СУБД в нативном формате и в формате XML (в контекстном меню от базы данных в древовидной структуре справа):
Честно говоря, исходный код можно увидеть для каждой сущности базы данных, будь то роль, схема, база данных или просто таблица.
В качестве заключения
Что ж, заявленные автором возможности данного ПО вполне себя оправдывают. Все очень интуитивно и просто.
Данный проект сейчас находится в версии v0.4.0-rc1 и активно развивается. Функционал достаточно богат, но возможны некоторые баги и недоработки, кои, впрочем, я пока не встретил.
Думаю, pgModeler придется по вкусу всем тем, кто выбирает для своих проектов PostgreSQL в качестве основной СУБД, и он поможет вам в моделировании и визуализации ваших баз данных.
PS: я не являюсь автором pgModeler.
PPS: c автором вы можете связаться сами.
bigint | int8 | знаковое целое из 8 байт |
bigserial | serial8 | восьмибайтное целое с автоувеличением |
bit [ ( | битовая строка фиксированной длины | |
bit varying [ ( | varbit [ ( | битовая строка переменной длины |
boolean | bool | логическое значение (true/false) |
box | прямоугольник в плоскости | |
bytea | двоичные данные («массив байт») | |
character [ ( | char [ ( | символьная строка фиксированной длины |
character varying [ ( | varchar [ ( | символьная строка переменной длины |
cidr | сетевой адрес IPv4 или IPv6 | |
circle | круг в плоскости | |
date | календарная дата (год, месяц, день) | |
double precision | float8 | число двойной точности с плавающей точкой (8 байт) |
inet | адрес узла IPv4 или IPv6 | |
integer | int , int4 | знаковое четырёхбайтное целое |
interval [ | интервал времени | |
json | текстовые данные JSON | |
jsonb | двоичные данные JSON, разобранные | |
line | прямая в плоскости | |
lseg | отрезок в плоскости | |
macaddr | MAC-адрес | |
money | денежная сумма | |
numeric [ ( | decimal [ ( | вещественное число заданной точности |
path | геометрический путь в плоскости | |
pg_lsn | Последовательный номер в журнале PostgreSQL | |
point | геометрическая точка в плоскости | |
polygon | замкнутый геометрический путь в плоскости | |
real | float4 | число одинарной точности с плавающей точкой (4 байта) |
smallint | int2 | знаковое двухбайтное целое |
smallserial | serial2 | двухбайтное целое с автоувеличением |
serial | serial4 | четырёхбайтное целое с автоувеличением |
text | символьная строка переменной длины | |
time [ ( | время суток (без часового пояса) | |
time [ ( | timetz | время суток с учётом часового пояса |
timestamp [ ( | дата и время (без часового пояса) | |
timestamp [ ( | timestamptz | дата и время с учётом часового пояса |
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:mi
—13:21
hh:mi am/pm
—1:21 pm
hh:mi:ss
—1: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 Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…
.
PostgreSQL CREATE TABLE AS Инструкция по примерам
Резюме : в этом руководстве вы узнаете, как использовать оператор PostgreSQL CREATE TABLE AS
для создания новой таблицы из набора результатов запроса.
Введение в оператор PostgreSQL CREATE TABLE
Оператор CREATE TABLE AS
создает новую таблицу и заполняет ее данными, возвращаемыми запросом. Ниже показан синтаксис оператора CREATE TABLE AS
:
CREATE TABLE имя_новой_таблицы
Запрос AS;
В этом синтаксисе:
- Сначала укажите новое имя таблицы после предложения
CREATE TABLE
. - Во-вторых, предоставьте запрос, набор результатов которого добавляется в новую таблицу после ключевого слова
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
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…
.
PostgreSQL Python: создание таблиц
Резюме : в этом руководстве вы узнаете, как создавать новые таблицы в базе данных PostgreSQL с помощью Python.
В этом руководстве предполагается, что вы знаете, как написать оператор CREATE TABLE
. Если это не так, вам следует ознакомиться с учебным курсом CREATE TABLE
.
Шаги по созданию таблиц PostgreSQL в Python
Чтобы создать новую таблицу в базе данных PostgreSQL, вы выполните следующие шаги:
- Сначала создайте операторы CREATE TABLE.
- Затем подключитесь к базе данных PostgreSQL, вызвав функцию
connect ()
. Функция connect ()
возвращает объект connection
. - Затем создайте объект
cursor
, вызвав метод cursor ()
объекта connection
. - После этого выполните
CREATE TABLE
, вызвав метод execute ()
объекта cursor
. - Наконец, закройте связь с сервером базы данных 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.
- Было ли это руководство полезным?
- Да Нет
.
Продукты
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
CREATE TABLE AS
для создания новой таблицы из набора результатов запроса. CREATE TABLE AS
создает новую таблицу и заполняет ее данными, возвращаемыми запросом. Ниже показан синтаксис оператора CREATE TABLE AS
: CREATE TABLE имя_новой_таблицы
Запрос AS;
CREATE TABLE
. 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;
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
. CREATE TABLE AS
для создания новой таблицы на основе результата запроса.Продукты
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
CREATE TABLE
. Если это не так, вам следует ознакомиться с учебным курсом CREATE TABLE
. connect ()
. Функция connect ()
возвращает объект connection
. cursor
, вызвав метод cursor ()
объекта connection
. CREATE TABLE
, вызвав метод execute ()
объекта cursor
. close ()
для объектов cursor
и connection
. 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 ()
python create_table.py
\ dt
, чтобы отобразить список таблиц из базы данных поставщиков
. поставщиков = # \ dt
Список отношений
Схема | Имя | Тип | Владелец
-------- + --------------- + ------- + ----------
общественный | part_drawings | стол | Postgres
общественный | части | стол | Postgres
общественный | vendor_parts | стол | Postgres
общественный | поставщики | стол | Postgres
(4 строки)
поставщиков
.
.