|
6 | 6 | <sect1 id="tutorial-advanced-intro">
|
7 | 7 | <title>Введение</title>
|
8 | 8 |
|
9 |
| - <para>В предыдущей главе мы изучили азы использования <acronym>SQL</acronym> для хранения и обработки данных в <productname>&productname;</productname>. Теперь мы обсудим более сложные возможности <acronym>SQL</acronym>, помогающие управлять данными и предотвратить их потерю или порчу. В конце главы мы рассмотрим некоторые расширения <productname>&productname;</productname>.</para> |
| 9 | + <para>В предыдущей главе мы изучили азы использования <acronym>SQL</acronym> для хранения и обработки данных в <productname>&project;</productname>. Теперь мы обсудим более сложные возможности <acronym>SQL</acronym>, помогающие управлять данными и предотвратить их потерю или порчу. В конце главы мы рассмотрим некоторые расширения <productname>&project;</productname>.</para> |
10 | 10 |
|
11 | 11 | <para>В этой главе мы будем время от времени ссылаться на примеры, приведённые в <xref remap="6" linkend="tutorial-sql"/> и изменять или развивать их, поэтому будет полезно сначала прочитать предыдущую главу. Некоторые примеры этой главы также можно найти в файле <filename>advanced.sql</filename> в каталоге tutorial. Кроме того, этот файл содержит пример данных для загрузки (здесь она повторно не рассматривается). Если вы не знаете, как использовать этот файл, обратитесь к <xref remap="3" linkend="tutorial-sql-intro"/>.</para>
|
12 | 12 | </sect1>
|
@@ -37,7 +37,7 @@ SELECT * FROM myview;</programlisting></para>
|
37 | 37 |
|
38 | 38 | <indexterm zone="tutorial-fk"><primary>ссылочная целостность</primary></indexterm>
|
39 | 39 |
|
40 |
| - <para>Вспомните таблицы <classname>weather</classname> и <classname>cities</classname> из <xref remap="2" linkend="tutorial-sql"/>. Давайте рассмотрим следующую задачу: вы хотите добиться, чтобы никто не мог вставить в таблицу <classname>weather</classname> строки, для которых не находится соответствующая строка в таблице <classname>cities</classname>. Это называется обеспечением <firstterm>ссылочной целостности</firstterm> данных. В простых СУБД это пришлось бы реализовать (если это вообще возможно) так: сначала явно проверить, есть ли соответствующие записи в таблице <classname>cities</classname>, а затем отклонить или вставить новые записи в таблицу <classname>weather</classname>. Этот подход очень проблематичен и неудобен, поэтому всё это <productname>&productname;</productname> может сделать за вас.</para> |
| 40 | + <para>Вспомните таблицы <classname>weather</classname> и <classname>cities</classname> из <xref remap="2" linkend="tutorial-sql"/>. Давайте рассмотрим следующую задачу: вы хотите добиться, чтобы никто не мог вставить в таблицу <classname>weather</classname> строки, для которых не находится соответствующая строка в таблице <classname>cities</classname>. Это называется обеспечением <firstterm>ссылочной целостности</firstterm> данных. В простых СУБД это пришлось бы реализовать (если это вообще возможно) так: сначала явно проверить, есть ли соответствующие записи в таблице <classname>cities</classname>, а затем отклонить или вставить новые записи в таблицу <classname>weather</classname>. Этот подход очень проблематичен и неудобен, поэтому всё это <productname>&project;</productname> может сделать за вас.</para> |
41 | 41 |
|
42 | 42 | <para>Новое объявление таблицы будет выглядеть так: <programlisting>CREATE TABLE cities (
|
43 | 43 | city varchar(80) primary key,
|
@@ -82,15 +82,15 @@ UPDATE branches SET balance = balance + 100.00
|
82 | 82 |
|
83 | 83 | <para>Другая важная характеристика транзакционных баз данных тесно связана с атомарностью изменений: когда одновременно выполняется множество транзакций, каждая из них не видит незавершённые изменения, произведённые другими. Например, если одна транзакция подсчитывает баланс по отделениям, будет неправильно, если она посчитает расход в отделении Алисы, но не учтёт приход в отделении Боба, или наоборот. Поэтому свойство транзакций "всё или ничего" должно определять не только, как изменения сохраняются в базе данных, но и как они видны в процессе работы. Изменения, производимые открытой транзакцией, невидимы для других транзакций, пока она не будет завершена, а затем они становятся видны все сразу.</para>
|
84 | 84 |
|
85 |
| - <para>В <productname>&productname;</productname> транзакция определяется набором SQL-команд, окружённым командами <command>BEGIN</command> и <command>COMMIT</command>. Таким образом, наша банковская транзакция должна была бы выглядеть так: <programlisting>BEGIN; |
| 85 | + <para>В <productname>&project;</productname> транзакция определяется набором SQL-команд, окружённым командами <command>BEGIN</command> и <command>COMMIT</command>. Таким образом, наша банковская транзакция должна была бы выглядеть так: <programlisting>BEGIN; |
86 | 86 | UPDATE accounts SET balance = balance - 100.00
|
87 | 87 | WHERE name = 'Alice';
|
88 | 88 | -- ...
|
89 | 89 | COMMIT;</programlisting></para>
|
90 | 90 |
|
91 | 91 | <para>Если в процессе выполнения транзакции мы решим, что не хотим фиксировать её изменения (например, потому что оказалось, что баланс Алисы стал отрицательным), мы можем выполнить команду <command>ROLLBACK</command> вместо <command>COMMIT</command>, и все наши изменения будут отменены.</para>
|
92 | 92 |
|
93 |
| - <para><productname>&productname;</productname> на самом деле отрабатывает каждый SQL-оператор как транзакцию. Если вы не вставите команду <command>BEGIN</command>, то каждый отдельный оператор будет неявно окружён командами <command>BEGIN</command> и <command>COMMIT</command> (в случае успешного завершения). Группу операторов, окружённых командами <command>BEGIN</command> и <command>COMMIT</command> иногда называют <firstterm>блоком транзакции</firstterm>.</para> |
| 93 | + <para><productname>&project;</productname> на самом деле отрабатывает каждый SQL-оператор как транзакцию. Если вы не вставите команду <command>BEGIN</command>, то каждый отдельный оператор будет неявно окружён командами <command>BEGIN</command> и <command>COMMIT</command> (в случае успешного завершения). Группу операторов, окружённых командами <command>BEGIN</command> и <command>COMMIT</command> иногда называют <firstterm>блоком транзакции</firstterm>.</para> |
94 | 94 |
|
95 | 95 | <note>
|
96 | 96 | <para>Некоторые клиентские библиотеки добавляют команды <command>BEGIN</command> и <command>COMMIT</command> автоматически и неявно создают за вас блоки транзакций. Подробнее об этом вы можете узнать в документации интересующего вас интерфейса.</para>
|
@@ -260,7 +260,7 @@ CREATE TABLE capitals (
|
260 | 260 | state char(2)
|
261 | 261 | ) INHERITS (cities);</programlisting></para>
|
262 | 262 |
|
263 |
| - <para>В данном случае строка таблицы <classname>capitals</classname> <firstterm>наследует</firstterm> все столбцы (<structfield>name</structfield>, <structfield>population</structfield> и <structfield>altitude</structfield>) от <firstterm>родительской таблицы</firstterm> <classname>cities</classname>. Столбец <structfield>name</structfield> имеет тип <type>text</type>, собственный тип <productname>&productname;</productname> для текстовых строк переменной длины. А в таблицу столиц добавлен дополнительный столбец <structfield>state</structfield>, в котором будет указан штат. В <productname>&productname;</productname> таблица может наследоваться от нуля или нескольких других таблиц.</para> |
| 263 | + <para>В данном случае строка таблицы <classname>capitals</classname> <firstterm>наследует</firstterm> все столбцы (<structfield>name</structfield>, <structfield>population</structfield> и <structfield>altitude</structfield>) от <firstterm>родительской таблицы</firstterm> <classname>cities</classname>. Столбец <structfield>name</structfield> имеет тип <type>text</type>, собственный тип <productname>&project;</productname> для текстовых строк переменной длины. А в таблицу столиц добавлен дополнительный столбец <structfield>state</structfield>, в котором будет указан штат. В <productname>&project;</productname> таблица может наследоваться от нуля или нескольких других таблиц.</para> |
264 | 264 |
|
265 | 265 | <para>Например, следующий запрос выведет названия всех городов, включая столицы, находящихся выше 500 футов над уровнем моря: <programlisting>SELECT name, altitude
|
266 | 266 | FROM cities
|
@@ -294,7 +294,7 @@ CREATE TABLE capitals (
|
294 | 294 | <sect1 id="tutorial-conclusion">
|
295 | 295 | <title>Заключение</title>
|
296 | 296 |
|
297 |
| - <para><productname>&productname;</productname> имеет множество возможностей, не затронутых в этом кратком введении, рассчитанном на начинающих пользователей <acronym>SQL</acronym>. Эти возможности будут рассмотрены в деталях в продолжении книги.</para> |
| 297 | + <para><productname>&project;</productname> имеет множество возможностей, не затронутых в этом кратком введении, рассчитанном на начинающих пользователей <acronym>SQL</acronym>. Эти возможности будут рассмотрены в деталях в продолжении книги.</para> |
298 | 298 |
|
299 | 299 | <para>Если вам необходима дополнительная вводная информация, посетите <ulink url="https://www.postgresql.org">сайт PostgreSQL</ulink>, там вы найдёте ссылки на другие ресурсы.</para>
|
300 | 300 | </sect1>
|
|
0 commit comments