+ href="#item4.11.1">4.11.1, это может выглядеть так:
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
- ÷Ù ÔÁËÖÅ ÍÏÖÅÔÅ ×ÙÚ×ÁÔØ nextval() É ÉÓÐÏÌØÚÏ×ÁÔØ ÜÔÏ ÚÎÁÞÅÎÉÅ ×
- INSERT ÉÌÉ ×ÙÚ×ÁÔØ currval() ÐÏÓÌÅ
+ Вы также можете вызвать nextval() и использовать это значение в
+ INSERT или вызвать currval() после
INSERT.
-
4.11.3) îÅ ÍÏÖÅÔ ÌÉ ÐÏÌÕÞÉÔØÓÑ ÔÁË, ÞÔÏ
- ÉÓÐÏÌØÚÏ×ÁÎÉÅ currval() É nextval() ÐÒÉ×ÅÄÅÔ Ë
- ÚÁÃÉËÌÉÒÏ×ÁÎÉÀ Ó ÄÒÕÇÉÍÉ ÐÏÌØÚÏ×ÁÔÅÌÑÍÉ?
+
4.11.3) Не может ли получиться так, что
+ использование currval() и nextval() приведет к
+ зациклированию с другими пользователями?
-
îÅÔ. currval() ×ÏÚ×ÒÁÝÁÅÔ ÔÅËÕÝÅÅ ÚÎÁÞÅÎÉÅ, ÎÁÚÎÁÞÅÎÎÏÅ ×ÁÛÅÊ
- ÓÅÓÓÉÅÊ, Á ÎÅ ÄÒÕÇÉÍÉ ÓÅÓÓÉÑÍÉ.
+
Нет. currval() возвращает текущее значение, назначенное вашей
+ сессией, а не другими сессиями.
-
4.11.4) ðÏÞÅÍÕ ÞÉÓÌÁ ÉÚ ÍÏÅÊ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ
- ÎÅ ÉÓÐÏÌØÚÕÀÔÓÑ ÓÎÏ×Á ÐÒÉ ÏÔÍÅÎÅ ÔÒÁÎÚÁËÃÉÉ? ðÏÞÅÍÕ ÓÏÚÄÁÀÔÓÑ ÒÁÚÒÙ×Ù
- ÐÒÉ ÎÕÍÅÒÁÃÉÉ × ËÏÌÏÎËÅ, ÇÄÅ Ñ ÉÓÐÏÌØÚÕÀ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ/SERIAL?
+
4.11.4) Почему числа из моей последовательности
+ не используются снова при отмене транзакции? Почему создаются разрывы
+ пÑ\80и нÑ\83меÑ\80аÑ\86ии в колонке, где Ñ\8f иÑ\81полÑ\8cзÑ\83Ñ\8e поÑ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c/SERIAL?
-
äÌÑ ÒÅÁÌÉÚÁÃÉÉ ËÏÎËÕÒÅÔÎÏÓÔÉ, ÚÎÁÞÅÎÉÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÅÊ, ÐÒÉ
- ÎÅÏÂÈÏÄÉÍÏÓÔÉ ×ÙÄÁÀÔÓÑ ×Ï ×ÒÅÍÑ ÚÁÐÕÓËÁ ÔÒÁÎÚÁËÃÉÊ É ÎÅ ÂÌÏËÉÒÕÀÔÓÑ
- ÄÏ ÐÏÌÎÏÇÏ ×ÙÐÏÌÎÅÎÉÑ ÔÒÁÎÚÁËÃÉÊ. üÔÏ ÍÏÖÅÔ ×ÙÚÙ×ÁÔØ ÒÁÚÒÙ×Ù ×
- ÎÕÍÅÒÁÃÉÉ ÐÒÉ ÏÔÍÅÎÅ ÔÒÁÎÚÁËÃÉÊ.
+
Для реализации конкуретности, значения последовательностей, при
+ необходимости выдаются во время запуска транзакций и не блокируются
+ до полного выполнения транзакций. Это может вызывать разрывы в
+ нумерации при отмене транзакций.
-
4.12) þÔÏ ÔÁËÏÅ OID? þÔÏ ÔÁËÏÅ
+
4.12) Что такое OID? Что такое
CTID?
-
åÓÌÉ ÔÁÂÌÉÃÁ ÓÏÚÄÁÎÁ Ó WITH OIDS, ÔÏ ËÁÖÄÁÑ ÓÔÒÏËÁ
- ÐÏÌÕÞÁÅÔ ÕÎÉËÁÌØÎÙÊ ÉÎÄÅÎÔÉÆÉËÁÔÏÒ OID.
- OID - ÜÔÏ Á×ÔÏÍÁÔÉÞÅÓËÉ ÎÁÚÎÁÞÁÅÍÏÅ ÕÎÉËÁÌØÎÏÅ 4-È
- ÂÁÊÔÏ×ÏÅ ÃÅÌÏÅ ÞÉÓÌÏ, ËÏÔÏÒÏÅ ÕÎÉËÁÌØÎÏ ÄÌÑ ×ÓÅÊ ÕÓÔÁÎÏ×ÌÅÎÎÏÊ óõâä.
- ïÄÎÁËÏ, ÐÏÓÌÅ ÔÏÇÏ ËÁË ÅÇÏ ÚÎÁÞÅÎÉÅ ÐÒÅ×ÙÓÉÔ 4 ÍÉÌÌÉÁÒÄÁ, ÚÎÁÞÅÎÉÑ
- OID ÎÁÞÉÎÁÀÔ ÄÕÂÌÉÒÏ×ÁÔØÓÑ. PostgreSQL ÉÓÐÏÌØÚÕÅÔ
- OID ÄÌÑ Ó×ÑÚÙ×ÁÎÉÑ Ó×ÏÉÈ ×ÎÕÔÒÅÎÎÉÈ ÔÁÂÌÉÃ.
-
-
äÌÑ ÕÎÉËÁÌØÎÏÇÏ ÚÎÁÞÅÎÉÑ × ÓÔÒÏËÁÈ ÔÁÂÌÉÃÙ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÌÕÞÛÉÍ
- ÓÐÏÓÏÂÏÍ Ñ×ÌÑÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÎÉÅ SERIAL ×ÍÅÓÔÏ
- OID, ÐÏÔÏÍÕ ÞÔÏ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ SERIAL
- ÕÎÉËÁÌØÎÙ ÔÏÌØËÏ ×ÎÕÔÒÉ ÔÁÂÌÉÃÙ É ÔÁËÉÍ ÏÂÒÁÚÏÍ ÍÅÎØÛÅ ÐÏÄ×ÅÒÖÅÎÙ
- ÐÅÒÅÐÏÌÎÅÎÉÀ. äÌÑ ÈÒÁÎÅÎÉÑ ÚÎÁÞÅÎÉÊ 8-ÍÉ ÂÁÊÔÎÏÊ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ
- ÄÏÓÔÕÐÅÎ ÔÉÐ SERIAL8.
-
-
CTID ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÉÄÅÎÔÉÆÉËÁÃÉÉ ÓÐÅÃÉÁÌØÎÙÈ
- ÆÉÚÉÞÅÓËÉÈ ÚÁÐÉÓÅÊ Ó ÂÌÏÞÎÙÍÉ É offset ÚÎÁÞÅÎÉÑÍÉ. CTID
- ÉÚÍÅÎÑÅÔÓÑ ÐÏÓÌÅ ÔÏÇÏ ËÁË ÓÔÒÏËÉ × ÔÁÂÌÉÃÅ ÂÙÌÉ ÉÚÍÅÎÅÎÙ ÉÌÉ ÐÅÒÅÇÒÕÖÅÎÙ.
-
TID ÉÓÐÏÌØÚÕÅÔÓÑ ÉÎÄÅËÓÎÙÍÉ ÚÁÐÉÓÑÍÉ × ËÁÞÅÓÔ×Å
- ÕËÁÚÁÔÅÌÑ ÎÁ ÆÉÚÉÞÅÓËÉÅ ÚÁÐÉÓÉ.
-
-
-
4.13) ðÏÞÅÍÕ Ñ ÐÏÌÕÞÁÀ ÏÛÉÂËÕ "ERROR: Memory
+
Если таблица создана с WITH OIDS, то каждая строка
+ полÑ\83Ñ\87аеÑ\82 Ñ\83никалÑ\8cнÑ\8bй инденÑ\82иÑ\84икаÑ\82оÑ\80 OID.
+ OID - это автоматически назначаемое уникальное 4-х
+ байтовое целое число, которое уникально для всей установленной СУБД.
+ Однако, после того как его значение превысит 4 миллиарда, значения
+ OID начинают дублироваться. PostgreSQL использует
+ OID для связывания своих внутренних таблиц.
+
+
Для уникального значения в строках таблицы пользователя, лучшим
+ способом является использование SERIAL вместо
+ OID, поÑ\82омÑ\83 Ñ\87Ñ\82о поÑ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82и SERIAL
+ уникальны только внутри таблицы и таким образом меньше подвержены
+ пеÑ\80еполнениÑ\8e. Ð\94лÑ\8f Ñ\85Ñ\80анениÑ\8f знаÑ\87ений 8-ми байÑ\82ной поÑ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82и
+ доступен тип SERIAL8.
+
+
CTID используется для идентификации специальных
+ физических записей с блочными и offset значениями. CTID
+ изменяется после того как строки в таблице были изменены или перегружены.
+
TID используется индексными записями в качестве
+ указателя на физические записи.
+
+
+
4.13) Почему я получаю ошибку "ERROR: Memory
exhausted in AllocSetAlloc()"?
-
ðÒÅÄÐÏÌÏÖÉÔÅÌØÎÏ Õ ×ÁÓ ÚÁËÏÎÞÉÌÁÓØ ×ÉÒÔÕÁÌØÎÁÑ ÐÁÍÑÔØ
- ÉÌÉ ÞÔÏ ×ÁÛÅ ÑÄÒÏ ÉÍÅÅÔ ÍÁÌÅÎØËÉÊ ÌÉÍÉÔ ÎÁ ÏÐÒÅÄÅÌÅÎÎÙÅ ÒÅÓÕÒÓÙ.
- ðÏÐÙÔÁÊÔÅÓØ ÐÅÒÅÄ ÚÁÐÕÓËÏÍ ÓÅÒ×ÅÒÁ âä ×ÙÐÏÌÎÉÔØ ÓÌÅÄÕÀÝÉÅ
- ËÏÍÁÎÄÙ:
+
Предположительно у вас закончилась виртуальная память
+ или что ваше ядро имеет маленький лимит на определенные ресурсы.
+ Попытайтесь перед запуском сервера БД выполнить следующие
+ команды:
ulimit -d 262144
limit datasize 256m
- ÷ ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ËÏÍÁÎÄÎÏÇÏ ÉÎÔÅÒÐÒÅÔÁÔÏÒÁ shell, ÔÏÌØËÏ ÏÄÎÁ ÉÚ ÄÁÎÎÙÈ
- ËÏÍÁÎÄ ×ÙÐÏÌÎÉÔÓÑ ÕÓÐÅÛÎÏ, ÎÏ ÏÎÁ ÐÏÚ×ÏÌÉÔ ×ÁÍ ÕÓÔÁÎÏ×ÉÔØ ÂÏÌØÛÉÊ
- ÓÅÇÍÅÎÔ ÄÁÎÎÙÈ ÐÒÏÃÅÓÓÁ É ×ÏÚÍÏÖÎÏ ÒÅÛÉÔ ÐÒÏÂÌÅÍÕ. üÔÁ ËÏÍÁÎÄÁ
- ÉÚÍÅÎÑÅÔ ÐÁÒÁÍÅÔÒÙ ÔÅËÕÝÅÇÏ ÐÒÏÃÅÓÓÁ É ×ÓÅÈ ÅÇÏ ÐÏÔÏÍËÏ×, ÓÏÚÄÁÎÎÙÈ
- ÐÏÓÌŠţ ÚÁÐÕÓËÁ. åÓÌÉ Õ ×ÁÓ ×ÏÚÎÉËÌÁ ÐÒÏÂÌÅÍÁ Ó SQL
- ËÌÉÅÎÔÏÍ, ÐÏÔÏÍÕ ÞÔÏ backend ×ÏÚ×ÒÁÝÁÅÔ ÓÌÉÛËÏÍ ÂÏÌØÛÏÊ ÏÂßÅÍ ÄÁÎÎÙÈ,
- ÐÏÐÙÔÁÊÔÅÓØ ×ÙÐÏÌÎÉÔØ ÜÔÕ ËÏÍÁÎÄÕ ÐÅÒÅÄ ÚÁÐÕÓËÏÍ ËÌÉÅÎÔÁ.
+ В зависимости от командного интерпретатора shell, только одна из данных
+ команд выполнится успешно, но она позволит вам установить больший
+ сегмент данных процесса и возможно решит проблему. Эта команда
+ изменяет параметры текущего процесса и всех его потомков, созданных
+ поÑ\81ле еÑ\91 запÑ\83Ñ\81ка. Ð\95Ñ\81ли Ñ\83 ваÑ\81 возникла пÑ\80облема Ñ\81 SQL
+ клиентом, потому что backend возвращает слишком большой объем данных,
+ попÑ\8bÑ\82айÑ\82еÑ\81Ñ\8c вÑ\8bполниÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 командÑ\83 пеÑ\80ед запÑ\83Ñ\81ком клиенÑ\82а.
-
4.14) ëÁË ÍÎÅ ÕÚÎÁÔØ, ËÁËÁÑ ×ÅÒÓÉÑ PostgreSQL
- ÚÁÐÕÝÅÎÁ?
+
4.14) Как мне узнать, какая версия PostgreSQL
+ запущена?
-
éÚ psql, ÎÁÂÅÒÉÔÅ SELECT version();
+
Из psql, наберите SELECT version();
-
4.15) ëÁË ÍÎÅ ÓÏÚÄÁÔØ ËÏÌÏÎËÕ ËÏÔÏÒÁÑ ÐÏ ÕÍÏÌÞÁÎÉÀ
- ÂÕÄÅÔ ÓÏÄÅÒÖÁÔØ ÔÅËÕÝÅÅ ×ÒÅÍÑ?
+
4.15) Как мне создать колонку которая по умолчанию
+ будет содержать текущее время?
-
éÓÐÏÌØÚÕÊÔÅ CURRENT_TIMESTAMP:
+
Используйте CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
-
4.16) ëÁË ÍÎÅ ×ÙÐÏÌÎÉÔØ ×ÎÅÛÎÅÅ Ó×ÑÚÙ×ÁÎÉÅ?
+
4.16) Как мне выполнить внешнее связывание?
-
PostgreSQL ÐÏÄÄÅÒÖÉ×ÁÅÔ ×ÎÅÛÎÅÅ Ó×ÑÚÙ×ÁÎÉÅ,
- ÉÓÐÏÌØÚÕÑ ÓÔÁÎÄÁÒÔÎÙÊ ÓÉÎÔÁËÓÉÓ SQL. ÷ÏÔ Ä×Á ÐÒÉÍÅÒÁ:
+
PostgreSQL поддеÑ\80живаеÑ\82 внеÑ\88нее Ñ\81вÑ\8fзÑ\8bвание,
+ используя стандартный синтаксис SQL. Вот два примера:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
- ÉÌÉ
+ или
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
-
üÔÏ ÉÄÅÎÔÉÞÎÙÅ ÚÁÐÒÏÓÙ Ó×ÑÚÙ×ÁÎÉÑ t1.col É t2.col, ÔÁËÖÅ ×ÏÚ×ÒÁÝÁÀÔ
- ÌÀÂÙÅ ÎÅÓ×ÑÚÁÎÎÙÅ ÓÔÒÏËÉ × t1 (ËÏÔÏÒÙÅ ÎÅ ÓÏ×ÐÁÄÁÀÔ Ó t2).
- RIGHT Ó×ÑÚÙ×ÁÎÉÅ ÄÏÌÖÎÏ ÄÏÂÁ×ÉÔØ ÎÅÓ×ÑÚÁÎÎÙÅ ÓÔÒÏËÉ
- t2. FULL Ó×ÑÚÙ×ÁÎÉÅ ÄÏÌÖÎÏ ×ÏÚ×ÒÁÔÉÔØ ÓÏ×ÐÁ×ÛÉÅ
- ÓÔÒÏËÉ ÐÌÀÓ ×ÓÅ ÎÅÓ×ÑÚÁÎÎÙÅ ÓÔÒÏËÉ ÉÚ t1 É t2. óÌÏ×Ï OUTER
- Ñ×ÌÑÅÔÓÑ ÎÅÏÂÑÚÁÔÅÌØÎÙÍ É ÎÁÚÎÁÞÁÅÔÓÑ × LEFT,
- RIGHT É FULL Ó×ÑÚÙ×ÁÎÉÑÈ. ïÂÙÞÎÙÅ
- Ó×ÑÚÙ×ÁÎÉÑ ÎÁÚÙ×ÁÀÔÓÑ INNER Ó×ÑÚÙ×ÁÎÉÑ.
+
Это идентичные запросы связывания t1.col и t2.col, также возвращают
+ любые несвязанные строки в t1 (которые не совпадают с t2).
+ RIGHT связывание должно добавить несвязанные строки
+ t2. FULL связывание должно возвратить совпавшие
+ строки плюс все несвязанные строки из t1 и t2. Слово OUTER
+ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f необÑ\8fзаÑ\82елÑ\8cнÑ\8bм и назнаÑ\87аеÑ\82Ñ\81Ñ\8f в LEFT,
+ RIGHT и FULL связываниях. Обычные
+ связывания называются INNER связывания.
-
4.17) ëÁË ×ÙÐÏÌÎÑÔØ ÚÁÐÒÏÓÙ, ÉÓÐÏÌØÚÕÀÝÉÅ ÎÅÓËÏÌØËÏ
- ÂÁÚ ÄÁÎÎÙÈ?
+
4.17) Как выполнять запросы, использующие несколько
+ баз данных?
-
îÅ ÓÕÝÅÓÔ×ÕÅÔ ÓÐÏÓÏÂÁ ÓÏÚÄÁÔØ ÚÁÐÒÏÓ Ë ÂÁÚÁÍ ÄÁÎÎÙÈ ÏÔÌÉÞÎÙÍ ÏÔ ÔÅËÕÝÅÊ.
- ðÏÓËÏÌØËÕ PostgreSQL ÚÁÇÒÕÖÁÅÔ ÓÉÓÔÅÍÎÙÅ ËÁÔÁÌÏÇÉ ÓÐÅÃÉÆÉÞÎÙÅ ÄÌÑ ÂÁÚÙ
- ÄÁÎÎÙÈ, ÎÅÐÏÎÑÔÎÏ ÄÁÖÅ, ËÁË ÄÏÌÖÅÎ ÓÅÂÑ ×ÅÓÔÉ ÔÁËÏÊ ÍÅÖÂÁÚÏ×ÙÊ ÚÁÐÒÏÓ.
+
Не существует способа создать запрос к базам данных отличным от текущей.
+ Поскольку PostgreSQL загружает системные каталоги специфичные для базы
+ данных, непонятно даже, как должен себя вести такой межбазовый запрос.
-
contrib/dblink ÐÏÚ×ÏÌÑÅÔ ÚÁÐÒÏÓÙ ÍÅÖÄÕ ÂÁÚÁÍÉ, ÉÓÐÏÌØÚÕÑ
- ×ÙÚÏ×Ù ÆÕÎËÃÉÊ. òÁÚÕÍÅÅÔÓÑ, ËÌÉÅÎÔ ÍÏÖÅÔ ÏÄÎÏ×ÒÅÍÅÎÎÏ ÔÁËÖÅ ÕÓÔÁÎÁ×ÌÉ×ÁÔØ
- ÓÏÅÄÉÅÎÅÎÉÑ Ó ÒÁÚÌÉÞÎÙÍÉ ÂÁÚÁÍÉ ÄÁÎÎÙÈ É ÔÁËÉÈ ÏÂÒÁÚÏÍ ÏÂßÅÄÉÎÑÔØ
- ÉÎÆÏÒÍÁÃÉÀ ÉÚ ÎÉÈ.
+
contrib/dblink позволÑ\8fеÑ\82 запÑ\80оÑ\81Ñ\8b междÑ\83 базами, иÑ\81полÑ\8cзÑ\83Ñ\8f
+ вызовы функций. Разумеется, клиент может одновременно также устанавливать
+ соедиенения с различными базами данных и таких образом объединять
+ информацию из них.
-
4.18) ëÁË ÍÎÅ ×ÅÒÎÕÔØ ÉÚ ÆÕÎËÃÉÉ ÎÅÓËÏÌØËÏ ÓÔÒÏË ÔÁÂÌÉÃÙ?
+
4.18) Как мне вернуть из функции несколько строк таблицы?
-
÷Ù ÍÏÖÅÔÅ ÌÅÇËÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÆÕÎËÃÉÉ, ×ÏÚ×ÒÁÝÁÀÝÉÅ ÓÐÉÓÏË,
+
Вы можете легко использовать функции, возвращающие список,
http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions.
-
4.19) ðÏÞÅÍÕ Ñ ÐÏÌÕÞÁÀ ÏÛÉÂËÕ "relation with OID ####
- ÎÅ ÓÕÝÅÓÔ×ÕÅÔ", ËÏÇÄÁ ÏÂÒÁÝÁÀÔÓØ Ë ×ÒÅÍÅÎÎÙÍ ÔÁÂÌÉÃÁÍ × ÆÕÎËÃÉÑÈ PL/PgSQL?
+
4.19) Почему я получаю ошибку "relation with OID ####
+ не существует", когда обращаютсь к временным таблицам в функциях PL/PgSQL?
-
÷ PostgreSQL ÄÏ ×ÅÒÓÉÉ 8.3, PL/PgSQL ËÜÛÉÒÕÅÔ ÓÃÅÎÁÒÉÉ ÆÕÎËÃÉÉ É ÏÄÉÎ ÉÚ
- ÎÅÇÁÔÉ×ÎÙÈ ÜÆÆÅËÔÏ× ÜÔÏÇÏ ÓÏÓÔÏÉÔ × ÔÏÍ, ÞÔÏ ÅÓÌÉ ÆÕÎËÃÉÑ PL/PgSQL ÏÂÒÁÝÁÅÔÓÑ
- Ë ×ÒÅÍÅÎÎÏÊ ÔÁÂÌÉÃÅ É ÜÔÁ ÔÁÂÌÉÃÁ ÐÏÚÄÎÅÅ ÕÄÁÌÑÅÔÓÑ É ÐÅÒÅÓÏÚÄÁÅÔÓÑ, Á ÆÕÎËÃÉÑ
- ÚÁÔÅÍ ×ÙÚÙ×ÁÅÔÓÑ ÓÎÏ×Á, ÔÏ ÅÅ ×ÙÚÏ× ÐÒÉ×ÅÄÅÔ Ë ÏÛÉÂËÅ, ÐÏÔÏÍÕ ÞÔÏ ÓËÜÛÉÒÏ×ÁÎÎÏÅ
- ÓÏÄÅÒÖÉÍÏÅ ÆÕÎËÃÉÉ ÓÏÄÅÒÖÉÔ ÕËÁÚÁÔÅÌØ ÎÁ ÓÔÁÒÕÀ ×ÒÅÍÅÎÎÕÀ ÔÁÂÌÉÃÕ. þÔÏÂÙ ÒÅÛÉÔØ
- ÜÔÕ ÐÒÏÂÌÅÍÕ, ÉÓÐÏÌØÚÕÊÔÅ EXECUTE ÄÌÑ ÄÏÓÔÕÐÁ Ë ×ÒÅÍÅÎÎÙÍ
- ÔÁÂÌÉÃÁÍ × PL/PgSQL. éÓÐÏÌØÚÏ×ÁÎÉÅ ÜÔÏÇÏ ÏÐÅÒÁÔÏÒÁ ÚÁÓÔÁ×ÉÔ ÚÁÐÒÏÓ
- ÐÅÒÅÇÅÎÅÒÉÒÏ×ÁÔØÓÑ ËÁÖÄÙÊ ÒÁÚ.
-
-
÷ PostgreSQL 8.3 É ÐÏÚÄÎÅÅ, ÜÔÏÊ ÐÒÏÂÌÅÍÙ ÎÅÔ.
+
В PostgreSQL до версии 8.3, PL/PgSQL кэширует сценарии функции и один из
+ негативных эффектов этого состоит в том, что если функция PL/PgSQL обращается
+ к временной таблице и эта таблица позднее удаляется и пересоздается, а функция
+ затем вызывается снова, то ее вызов приведет к ошибке, потому что скэшированное
+ содержимое функции содержит указатель на старую временную таблицу. Чтобы решить
+ эту проблему, используйте EXECUTE для доступа к временным
+ таблицам в PL/PgSQL. Использование этого оператора заставит запрос
+ пеÑ\80егенеÑ\80иÑ\80оваÑ\82Ñ\8cÑ\81Ñ\8f каждÑ\8bй Ñ\80аз.
+
+
В PostgreSQL 8.3 и позднее, этой проблемы нет.
-
4.20) ëÁËÉÅ ÅÓÔØ ÒÅÛÅÎÉÑ ÄÌÑ ÒÅÐÌÉËÁÃÉÉ?
+
4.20) Какие есть решения для репликации?
-
èÏÔÑ "ÒÅÐÌÉËÁÃÉÑ" -- ÜÔÏ ÅÄÉÎÙÊ ÔÅÒÍÉÎ, ÅÓÔØ ÎÅÓËÏÌØËÏ ÒÁÚÎÙÈ ÔÅÈÎÏÌÏÇÉÊ
- ÄÌÑ ×ÙÐÏÌÎÅÎÉÑ ÒÅÐÌÉËÁÃÉÊ Ó ÒÁÚÎÙÍÉ ÏÓÏÂÅÎÎÏÓÔÑÍÉ ÄÌÑ ËÁÖÄÏÊ.
+
Хотя "репликация" -- это единый термин, есть несколько разных технологий
+ для выполнения репликаций с разными особенностями для каждой.
-
òÅÐÌÉËÁÃÉÑ Master/slave ÐÏÚ×ÏÌÑÅÔ ÉÍÅÔØ ÏÄÉÎ ÇÌÁ×ÎÙÊ (master) ÓÅÒ×ÅÒ
- ÄÌÑ ×ÙÐÏÌÎÅÎÉÑ ÚÁÐÒÏÓÏ× ÞÔÅÎÉÑ/ÚÁÐÉÓÉ, × ÔÏ ×ÒÅÍÑ ËÁË ÐÏÄÞÉΣÎÎÙÅ
- (slave) ÓÅÒ×ÅÒÁ ÍÏÇÕÔ ÐÒÏÉÚ×ÏÄÉÔØ ÔÏÌØËÏ ÚÁÐÒÏÓÙ
- ÞÔÅÎÉÑ/SELECT. îÁÉÂÏÌÅÅ ÐÏÐÕÌÑÒÎÙÍ ÒÅÛÅÎÉÅÍ ÄÌÑ ÒÅÐÌÉËÁÃÉÉ
- master-slave × PostgreSQL Ñ×ÌÑÅÔÓÑ
+
Репликация Master/slave позволяет иметь один главный (master) сервер
+ для выполнения запросов чтения/записи, в то время как подчинённые
+ (slave) сервера могут производить только запросы
+ чтения/SELECT. Наиболее популярным решением для репликации
+ master-slave в PostgreSQL является
Slony-I.
-
òÅÐÌÉËÁÃÉÑ Multi-master ÐÏÚ×ÏÌÑÅÔ ×ÙÐÏÌÎÑÔØ ÚÁÐÒÏÓÙ ÞÔÅÎÉÑ/ÚÁÐÉÓÉ
- ÎÁ ÎÅÓËÏÌØËÉÈ, ÒÅÐÌÉÃÉÒÕÅÍÙÈ ÄÒÕÇ Ó ÄÒÕÇÏÍ ËÏÍÐØÀÅÔÒÁÈ. üÔÁ ÏÓÏÂÅÎÎÏÓÔØ
- ÔÁËÖÅ ÐÒÉ×ÏÄÉÔ Ë ÐÏÔÅÒÅ ÐÒÏÉÚ×ÏÄÉÔÅÌØÎÏÓÔÉ, ÐÏÔÏÍÕ ÞÔÏ ÎÅÏÂÈÏÄÉÍÁ
- ÓÉÎÈÒÏÎÉÚÁÃÉÑ ÉÚÍÅÎÅÎÉÊ ÍÅÖÄÕ ÎÅÓËÏÌØËÉÍÉ ÓÅÒ×ÅÒÁÍÉ. îÁÉÂÏÌÅÅ
- ÐÏÐÕÌÑÒÎÙÍ ÒÅÛÅÎÉÅÍ ÄÌÑ ÔÁËÏÊ ÒÅÐÌÉËÁÃÉÉ × PostgreSQL Ñ×ÌÑÅÔÓÑ
+
Репликация Multi-master позволяет выполнять запросы чтения/записи
+ на нескольких, реплицируемых друг с другом компьюетрах. Эта особенность
+ также приводит к потере производительности, потому что необходима
+ синхронизация изменений между несколькими серверами. Наиболее
+ попÑ\83лÑ\8fÑ\80нÑ\8bм Ñ\80еÑ\88ением длÑ\8f Ñ\82акой Ñ\80епликаÑ\86ии в PostgreSQL Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f
-
4.21) ðÏÞÅÍÕ ÉÍÅÎÁ ÔÁÂÌÉÃÙ É ËÏÌÏÎÏË ÎÅ
- ÒÁÓÐÏÚÎÁÀÔÓÑ × × ÍÏ£Í ÚÁÐÒÏÓÅ? ðÏÞÅÍÕ ÎÅ ÓÏÈÒÁÎÑÀÔÓÑ ÚÁÇÌÁ×ÎÙÅ ÂÕË×Ù?
+
4.21) Почему имена таблицы и колонок не
+ распознаются в в моём запросе? Почему не сохраняются заглавные буквы?
-
îÁÉÂÏÌÅÅ ÞÁÓÔÏ ÉÍÅÎÁ ÎÅÒÁÓÐÏÚÎÁÀÔÓÑ ÉÚ-ÚÁ ÉÓÐÏÌØÚÏ×ÁÎÉÑ Ä×ÏÊÎÙÈ ËÁ×ÙÞÅË ×
- ÉÍÅÎÉ ÔÁÂÌÉÃÙ ÉÌÉ ËÏÌÏÎËÉ ÐÒÉ ÓÏÚÄÁÎÉÉ ÔÁÂÌÉÃÙ. ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ Ä×ÏÊÎÙÈ
- ËÁ×ÙÞÅË, ÉÍÑ ÔÁÂÌÉÃÙ É ËÏÌÏÎËÉ (ËÏÔÏÒÙÅ ÎÁÚÙ×ÁÀÔ ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍÉ)
- ÒÅÇÉÓÔÒÏ-ÚÁ×ÉÓÉÍÏÍ ×ÉÄÅ; ÜÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ×Ù ÄÏÌÖÎÙ ÉÓÐÏÌØÚÏ×ÁÔØ
- Ä×ÏÊÎÙÅ ËÁ×ÙÞËÉ, ËÏÇÄÁ ÕËÁÚÙ×ÁÅÔÅ ÜÔÉ ÉÍÅÎÁ × ÚÁÐÒÏÓÅ. îÅËÏÔÏÒÙÅ
- ÉÎÔÅÒÆÅÊÓÙ, ÔÁËÉÅ ËÁË pgAdmin, ×Ï ×ÒÅÍÑ ÓÏÚÄÁÎÉÑ ÔÁÂÌÉÃÙ ÄÏÂÁ×ÌÑÀÔ
- Ä×ÏÊÎÙÅ ËÁ×ÙÞËÉ Á×ÔÏÍÁÔÉÞÅÓËÉ. ôÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏÂÙ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ
- ÒÁÓÐÏÚÎÁ×ÁÌÉÓØ ×Ù ÄÏÌÖÎÙ ÓÌÅÄÏ×ÁÔØ ÏÄÎÏÍÕ ÉÚ ÓÌÅÄÕÀÝÉÈ ÐÒÁ×ÉÌ:
+
Наиболее часто имена нераспознаются из-за использования двойных кавычек в
+ имени таблицы или колонки при создании таблицы. При использовании двойных
+ кавычек, имя таблицы и колонки (которые называют идентификаторами)
+ регистро-зависимом виде; это означает, что вы должны использовать
+ двойные кавычки, когда указываете эти имена в запросе. Некоторые
+ интерфейсы, такие как pgAdmin, во время создания таблицы добавляют
+ двойные кавычки автоматически. Таким образом, чтобы идентификаторы
+ распознавались вы должны следовать одному из следующих правил:
-
éÚÂÅÇÁÔØ ÉÓÐÏÌØÚÏ×ÁÎÉÑ Ä×ÏÊÎÙÈ ËÁ×ÙÞÅË ÐÒÉ ÓÏÚÄÁÎÉÉ ÔÁÂÌÉÃ
-
éÓÐÏÌØÚÏ×ÁÔØ × ÉÄÅÎÔÉÆÉËÁÔÏÒÁÈ ÔÏÌØËÏ ÓÉÍ×ÏÌÙ ÎÉÖÎÅÇÏ ÒÅÇÉÓÔÒÁ
-
éÓÐÏÌØÚÏ×ÁÔØ Ä×ÏÊÎÙÅ ËÁ×ÙÞËÉ ÄÌÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× × ÚÁÐÒÏÓÁÈ
+
Избегать использования двойных кавычек при создании таблиц
+
Использовать в идентификаторах только символы нижнего регистра
+
Использовать двойные кавычки для идентификаторов в запросах