Въведение
PostgreSQL и други системи за управление на релационни бази данни използват бази данни и таблици да структурират и организират своите данни. Можем бързо да прегледаме определението на тези два термина:
- бази данни: отделете различни набори от структури и данни един от друг
- таблици: дефинирайте структурата на данните и съхранявайте действителните стойности на данните в базите данни
В PostgreSQL има и междинен обект между бази данни и таблици, наречен схема :
- схема: пространство от имена в база данни, което съдържа таблици, индекси, изгледи и други елементи.
Това ръководство няма да се занимава директно с концепцията на PostgreSQL за схема, но е добре да знаете, че е там.
Вместо това ще се съсредоточим върху това как да създаваме и унищожаваме PostgreSQL бази данни и таблици. Примерите ще използват предимно SQL, но към края ще ви покажем как да изпълнявате някои от тези задачи с помощта на командния ред. Тези алтернативи използват инструменти, включени в стандартната инсталация на PostgreSQL, които са налични, ако имате административен достъп до хоста на PostgreSQL.
Някои от изразите, обхванати в това ръководство, особено PostgreSQL CREATE TABLE
изявление, имат много допълнителни опции, които са извън обхвата на тази статия. Ако искате допълнителна информация, научете повече, като разгледате официалната документация на PostgreSQL.
Предварителни условия
За да следвате това ръководство, ще трябва да влезете в екземпляр на PostgreSQL с потребител с административни привилегии, използвайки psql
клиент на командния ред. Вашият PostgreSQL екземпляр може да бъде инсталиран локално, отдалечено или предоставен от доставчик.
По-конкретно, вашият потребител на PostgreSQL ще се нуждае от CREATE DB
привилегия или да бъдете Superuser
, което можете да проверите с \du
мета-команда в psql
:
\du
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
postgres
superuser, който се създава автоматично при инсталиране, има необходимите привилегии, но можете да използвате всеки потребител с Create DB
привилегия.
Създаване на нова база данни
След като сте свързани с вашия PostgreSQL екземпляр с помощта на psql
или всеки друг SQL клиент, можете да създадете база данни с помощта на SQL.
Основният синтаксис за създаване на база данни е:
CREATE DATABASE db_name;
Това ще създаде база данни, наречена db_name
на текущия сървър с текущия потребител, зададен като собственик на новата база данни, използвайки настройките на базата данни по подразбиране. Можете да видите свойствата на template1
по подразбиране шаблон с помощта на следния psql
мета-команда:
\l template1
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges-----------+----------+----------+-------------+-------------+----------------------- template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres(1 row)
Можете да добавите допълнителни параметри, за да промените начина, по който е създадена вашата база данни. Това са някои често срещани опции:
- КОДИРАНЕ: задава кодирането на знаци за базата данни.
- LC_COLLATE: задава колекция , или сортиране, ред за базата данни. Това е опция за локализация, която определя как са организирани артикулите, когато са поръчани.
- LC_CTYPE: задава класификацията на знаците за новата база данни. Това е опция за локализация, която засяга кои знаци се считат за главни, малки и цифри.
Те могат да помогнат да се гарантира, че базата данни може да съхранява данни във форматите, които планирате да поддържате, и с предпочитанията за локализация на вашия проект.
Например, за да гарантирате, че вашата база данни е създадена с поддръжка на Unicode и да замените собствения локал на сървъра, за да използвате локализация на американски английски (всички те съвпадат със стойностите в template1
показано по-горе, така че всъщност няма да настъпи промяна), можете да въведете:
CREATE DATABASE db_name ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
За да следвате примерите в това ръководство, създайте база данни, наречена school
като използвате настройките за локал по подразбиране на вашия екземпляр и кодирането на знаци UTF8:
CREATE DATABASE school ENCODING 'UTF8';
Това ще създаде вашата нова база данни с помощта на предоставените от вас спецификации.
Списък на съществуващите бази данни
За да определите кои бази данни са налични в момента на вашия сървър или клъстер, можете да използвате следния SQL израз:
SELECT datname FROM pg_database;
Това ще изброи всяка от базите данни, дефинирани в момента в средата:
datname----------- _dodb template1 template0 defaultdb school(5 rows)
Както бе споменато по-горе, ако сте свързани с помощта на psql
клиент, можете също да получите тази информация \l
мета-команда:
\l
Това ще покаже наличните имена на бази данни заедно с техните собственици, кодиране, настройки за локал и привилегии:
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges-----------+----------+----------+-------------+-------------+----------------------- _dodb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | defaultdb | doadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | school | doadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres(5 rows)
school
база данни, която създадохме, се показва сред другите бази данни в системата. Това е добър начин да получите общ преглед на базите данни във вашия сървър или клъстер.
Създаване на таблици в бази данни
След като създадете една или повече бази данни, можете да започнете да дефинирате таблици за съхранение на вашите данни. Таблиците се състоят от име и дефинирана схема, която определя полетата и типовете данни, които всеки запис трябва да съдържа.
PostgreSQL CREATE TABLE
синтаксис
Можете да създавате таблици с помощта на CREATE TABLE
изявление. Опростеният основен синтаксис за командата изглежда по следния начин:
CREATE TABLE table_name ( column_name TYPE [column_constraint], [table_constraint,]);
Компонентите на горния синтаксис включват следното:
CREATE TABLE table_name
:Основният оператор за създаване, който сигнализира, че искате да дефинирате таблица.table_name
заместителят трябва да бъде заменен с името на таблицата, която искате да използвате.column_name TYPE
:Дефинира основна колона в таблицата.column_name
заместителят трябва да бъде заменен с името, което искате да използвате за вашата колона.TYPE
определя типа данни PostgreSQL за колоната. Данните, съхранявани в таблицата, трябва да отговарят на структурата на колоните и типовете данни на колоните, за да бъдат приети.column_constraint
:Ограниченията в колоната са незадължителни ограничения за добавяне на допълнителни ограничения върху данните, които могат да се съхраняват в колоната. Например, можете да изисквате записите да не са нулеви, уникални или положителни цели числа.table_constraints
:Ограниченията в таблицата са подобни на ограниченията за колони, но включват взаимодействието на множество колони. Например, можете да имате ограничение на таблицата, което проверява далиDATE_OF_BIRTH
е предиDATE_OF_DEATH
в таблица.
Създавайте таблици условно с IF NOT EXISTS
клауза
По подразбиране, ако се опитате да създадете таблица в PostgreSQL, която вече съществува в базата данни, ще възникне грешка. За да заобиколите този проблем в случаите, когато искате да създадете таблица, ако тя не присъства, но просто да продължите, ако вече съществува, можете да използвате IF NOT EXISTS
клауза. IF NOT EXISTS
незадължителен квалификатор, който казва на PostgreSQL да игнорира израза, ако базата данни вече съществува.
За да използвате IF NOT EXISTS
клауза, вмъкнете го в командата след CREATE TABLE
синтаксис и преди името на таблицата:
CREATE TABLE IF NOT EXISTS table_name ( column_name TYPE [column_constraint], [table_constraint,]);
Този вариант ще се опита да създаде таблицата. Ако таблица с това име вече съществува в посочената база данни, PostgreSQL ще изведе предупреждение, което показва, че името на таблицата вече е заето, вместо да се провали с грешка.
Как да създавате таблици в PostgreSQL
Горният синтаксис е достатъчен за създаване на основни таблици. Като пример ще създадем две таблици в нашето school
база данни. Една таблица ще се нарича supplies
а другият ще се нарича teachers
:
В supplies
таблица, искаме да имаме следните полета:
- ИД: Уникален идентификационен номер за всеки тип училищни принадлежности.
- Име: Името на конкретен учебен предмет.
- Описание: Кратко описание на артикула.
- Производител: Името на производителя на артикула.
- Цвят: Цветът на артикула.
- Рекламни наличности: Броят на артикулите, с които разполагаме за определен вид училищни принадлежности. Това никога не трябва да е по-малко от 0.
Можем да създадем supplies
таблица с горните качества, използвайки следния SQL.
Първо, преминете към school
база данни, която сте създали с psql
като напишете:
\c school
Това ще промени базата данни, към която ще бъдат насочени бъдещите ни команди. Вашата подкана трябва да се промени, за да отразява базата данни.
След това създайте supplies
таблица със следното изявление:
CREATE TABLE supplies ( id INT PRIMARY KEY, name VARCHAR, description VARCHAR, manufacturer VARCHAR, color VARCHAR, inventory int CHECK (inventory > 0));
Това ще създаде supplies
таблица в school
база данни. PRIMARY KEY
Ограничението на колоната е специално ограничение, използвано за обозначаване на колони, които могат уникално да идентифицират записи в таблицата. Като такова, ограничението указва, че колоната не може да бъде нула и трябва да бъде уникална. PostgreSQL създава индекси за колони с първичен ключ, за да увеличи скоростта на заявките.
Проверете дали новата таблица е налице, като напишете:
\dt
List of relations Schema | Name | Type | Owner --------+----------+-------+--------- public | supplies | table | doadmin(1 row)
Проверете дали схемата отразява планирания дизайн, като напишете:
\d supplies
Table "public.supplies" Column | Type | Collation | Nullable | Default--------------+-------------------+-----------+----------+--------- id | integer | | not null | name | character varying | | | description | character varying | | | manufacturer | character varying | | | color | character varying | | | inventory | integer | | |Indexes: "supplies_pkey" PRIMARY KEY, btree (id)Check constraints: "supplies_inventory_check" CHECK (inventory > 0)
Можем да видим всяка от колоните и типовете данни, които посочихме. Ограничението на колоната, което дефинирахме за inventory
колоната е посочена към края.
След това ще създадем teachers
маса. В тази таблица трябва да присъстват следните колони:
- Идентификационен номер на служител :Уникален идентификационен номер на служител.
- Име :Името на учителя.
- Фамилия :Фамилия на учителя.
- Тема :Предметът, който учителят е нает да преподава.
- Ниво на степен :Нивото на класа на учениците, които преподавателят е нает да преподава.
Създайте teachers
таблица с горната схема със следния SQL:
CREATE TABLE teachers ( id INT PRIMARY KEY, first_name VARCHAR, last_name VARCHAR, subject VARCHAR, grade_level int);
Как да създавате таблици с първични и външни ключове
Можете да намерите информация за създаване на таблици с първични и външни ключове в някои от другите ни ръководства за PostgreSQL. Първичните и външните ключове са и двата типа ограничения на базата данни в PostgreSQL.
Първичният ключ е специална колона или колона, която гарантирано е уникална за всички редове в една и съща таблица. Всички първични ключове могат да се използват за уникално идентифициране на конкретен ред. Първичните ключове не само гарантират, че всеки ред има уникална стойност за колоните с първичен ключ, но също така гарантират, че нито един ред не съдържа NULL
стойности за тази колона. Често първичният ключ в PostgreSQL използва следния формат, за да посочи автоматично присвоен нарастващ първичен ключ:id SERIAL PRIMARY KEY
.
Външните ключове са начин да се гарантира, че колона или колони в една таблица съответстват на стойностите, съдържащи се в друга таблица. Това помага да се осигури референтна цялост между таблиците.
Как да преглеждате таблици в PostgreSQL
В PostgreSQL можете да изброите таблици по няколко различни начина в зависимост от това каква информация търсите.
Ако искате да видите какви таблици са налични във вашата база данни, можете да използвате \dt
мета-команда, включена в psql
клиент да изброи всички таблици, както демонстрирахме по-горе:
\dt
List of relations Schema | Name | Type | Owner--------+----------+-------+--------- public | supplies | table | doadmin public | teachers | table | doadmin(2 rows)
Можете също да проверите дали схемата за таблицата съответства на вашите спецификации:
\d teachers
Table "public.teachers" Column | Type | Collation | Nullable | Default-------------+-------------------+-----------+----------+--------- id | integer | | not null | first_name | character varying | | | last_name | character varying | | | subject | character varying | | | grade_level | integer | | |Indexes: "teachers_pkey" PRIMARY KEY, btree (id)
teachers
таблицата изглежда отговаря на нашата дефиниция.
Промяна на таблици
Ако трябва да промените схемата на съществуваща таблица в PostgreSQL, можете да използвате ALTER TABLE
команда. ALTER TABLE
командата е много подобна на CREATE TABLE
команда, но работи върху съществуваща таблица.
Промяна на синтаксиса на таблицата
Основният синтаксис за модифициране на таблици в PostgreSQL изглежда така:
ALTER TABLE <table_name> <change_command> <change_parameters>
<change_command>
посочва точния тип промяна, която искате да направите, независимо дали включва задаване на различни опции в таблицата, добавяне или премахване на колони, или промяна на типове или ограничения. <change_parameters>
част от командата съдържа всякаква допълнителна информация, необходима на PostgreSQL, за да завърши промяната.
Добавяне на колони към таблици
Можете да добавите колона към PostgreSQL таблица с ADD COLUMN
команда за промяна. Параметрите за промяна ще включват името на колоната, типа и опциите, точно както бихте ги посочили в CREATE TABLE
команда.
Например, за да добавите колона, наречена missing_column
на text
въведете в таблица, наречена some_table
, бихте написали:
ALTER TABLE some_table ADD COLUMN missing_column text;
Премахване на колони от таблици
Ако вместо това искате да премахнете съществуваща колона, можете да използвате DROP COLUMN
вместо това команда. Трябва да посочите името на колоната, която искате да премахнете като параметър за промяна:
ALTER TABLE some_table DROP COLUMN useless_column;
Промяна на типа данни на колона
За да промените типа данни, който PostgreSQL използва за конкретна колона, можете да използвате ALTER COLUMN
команда за промяна с SET DATA TYPE
команда колона. Параметрите включват името на колоната, нейния нов тип и незадължителен USING
клауза, за да посочите как старият тип трябва да бъде преобразуван в нов тип.
Например, за да зададете стойността на id
колона в resident
таблица към int
използвайки изрично прехвърляне, можем да напишем следното:
ALTER TABLE resident ALTER COLUMN id SET DATA TYPE int USING id::int;
Други промени в таблицата
Много други видове промени могат да бъдат постигнати с ALTER TABLE
команда. За повече информация относно наличните опции вижте официалната документация на PostgreSQL за ALTER TABLE
.
Изпускане на таблици
Ако искате да изтриете таблица, можете да използвате DROP TABLE
SQL изявление. Това ще изтрие таблицата, както и всички данни, съхранявани в нея.
Основният синтаксис изглежда така:
DROP TABLE table_name;
Това ще изтрие таблицата, ако съществува, и ще изведе грешка, ако името на таблицата не съществува.
Ако искате да изтриете таблицата, ако тя съществува, и да не правите нищо, ако не съществува, можете да включите IF EXISTS
квалификатор в изявлението:
DROP TABLE IF EXISTS table_name;
Таблици, които имат зависимости от други таблици или обекти, не могат да бъдат изтрити по подразбиране, докато тези зависимости съществуват. За да избегнете грешката, можете по желание да включите CASCADE
параметър, който автоматично премахва всички зависимости заедно с таблицата:
DROP TABLE table_name CASCADE;
Ако някои таблици имат външен ключ ограничение, което препраща към таблицата, която изтривате, това ограничение автоматично ще бъде изтрито.
Изтрийте supplies
таблица, която създадохме по-рано, като напишем:
DROP TABLE supplies;
Ще запазим teachers
база данни, за да демонстрира, че изразът за изтриване на бази данни също премахва всички дъщерни обекти като таблици.
Изхвърляне на бази данни
DROP DATABASE
оператор казва на PostgreSQL да изтрие посочената база данни. Основният синтаксис изглежда така:
DROP DATABASE database_name;
Заменете database_name
заместител с името на базата данни, която искате да премахнете. Това ще изтрие базата данни, ако бъде намерена. Ако базата данни не може да бъде намерена, ще възникне грешка:
DROP DATABASE some_database;
ERROR: database "some_database" does not exist
Ако искате да изтриете базата данни, ако тя съществува и по друг начин да не правите нищо, включете незадължителния IF EXISTS
опция:
DROP DATABASE IF EXISTS some_database;
NOTICE: database "some_database" does not exist, skippingDROP DATABASE
Това ще премахне базата данни или ще направи нищо, ако не може да бъде намерена.
За да премахнете school
база данни, която използвахме в това ръководство, избройте съществуващите бази данни във вашата система:
\l
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges-----------+----------+----------+-------------+-------------+----------------------- _dodb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | defaultdb | doadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | school | doadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres(5 rows)
Отворете нова връзка с една от базите данни, които не желаете да изтриете:
\c defaultdb
След като се отвори новата връзка, изтрийте school
база данни със следната команда:
DROP DATABASE school;
Това ще премахне school
база данни заедно с teachers
таблица, дефинирана вътре.
Ако сте следвали с SQL, можете да приключите тук или да преминете към заключението. Ако искате да научите как да създавате и изтривате бази данни от командния ред, продължете към следващия раздел.
Използване на административни инструменти за команден ред за създаване и изтриване на бази данни
Ако имате шел достъп до сървъра или клъстера, където е инсталиран PostgreSQL, може да имате достъп до някои допълнителни инструменти на командния ред, които могат да ви помогнат при създаването и изтриването на бази данни. createdb
и dropdb
командите са в пакет с PostgreSQL, когато е инсталиран.
Създайте нова база данни от командния ред
Основният синтаксис за createdb
команда (която трябва да се изпълнява от системен потребител с администраторски достъп до PostgreSQL) е:
createdb db_name
Това ще създаде база данни, наречена db_name
в PostgreSQL, като използвате настройките по подразбиране.
Командата също така приема опции за промяна на поведението си, подобно на SQL варианта, който видяхте по-рано. Можете да научите повече за тези опции с man createdb
. Някои от най-важните опции са:
--encoding=
:задава кодирането на знаци за базата данни.--locale=
:задава локала за базата данни.
Те могат да помогнат да се гарантира, че базата данни може да съхранява данни във форматите, които планирате да поддържате, и с предпочитанията за локализация на вашия проект.
Например, за да сте сигурни, че вашата база данни е създадена с поддръжка на Unicode и за да замените собствения локал на сървъра, за да използвате локализация на американски английски, можете да въведете:
createdb --encoding=UTF8 --locale=en_US db_name
Ако приемем, че имате правилните разрешения, базата данни ще бъде създадена според вашите спецификации.
За да следвате примерите в това ръководство, можете да създадете база данни, наречена school
използвайки локала по подразбиране и кодирането на знаци UTF8, като напишете:
createdb --encoding=UTF8 school
След това можете да се свържете с базата данни с помощта на psql
за да настроите масите си както обикновено.
Изхвърлете базите данни от командния ред
dropdb
командата отразява DROP DATABASE
SQL изявление. Той има следния основен синтаксис:
dropdb database_name
Променете database_name
заместител за препратка към базата данни, която искате да изтриете.
По подразбиране тази команда ще доведе до грешка, ако посочената база данни не може да бъде намерена. За да избегнете това, можете да включите незадължителния --if-exists
флаг:
dropdb --if-exists database_name
Това ще изтрие посочената база данни, ако съществува. В противен случай няма да направи нищо.
За да изтриете school
база данни, която създадохме по-рано, въведете:
dropdb school
Това ще премахне базата данни и всички дъщерни елементи, като таблици, вътре.
Заключение
Тази статия обхваща основите на това как да създавате и изтривате бази данни и таблици в PostgreSQL. Това са някои от най-основните команди, необходими за настройване на система от база данни и за определяне на структурата на вашите данни.
Както споменахме по-рано, SQL операторите, обхванати в този урок за PostgreSQL, особено CREATE TABLE
изявление, имат много допълнителни параметри, могат да се използват за промяна на поведението на PostgreSQL. Можете да научите повече за тях, като разгледате официалната документация на PostgreSQL.