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

Вставка данных

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

Чтобы создать новую строку, используйте команду INSERT . Команде требуются имя таблицы и значения столбца.

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

Пример команды для вставки строки:

INSERT INTO products VALUES (1, 'Cheese', 9.99);

Значения данных перечислены в том порядке, в котором столбцы появляются в таблице, разделенные запятыми. Обычно значения данных будут литералами (константами), но допустимы и скалярные выражения.

Приведенный выше синтаксис имеет тот недостаток, что вам необходимо знать порядок столбцов в таблице. Чтобы избежать этого, вы также можете явно перечислить столбцы. Например, обе следующие команды имеют тот же эффект, что и приведенная выше:

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);
INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);

Многие пользователи считают хорошей практикой всегда указывать имена столбцов.

Если у вас нет значений для всех столбцов, вы можете опустить некоторые из них. В этом случае столбцы будут заполнены значениями по умолчанию. Например:

INSERT INTO products (product_no, name) VALUES (1, 'Cheese');
INSERT INTO products VALUES (1, 'Cheese');

Вторая форма — это расширение PostgreSQL . Он заполняет столбцы слева столько значений, сколько указано, а остальные будут по умолчанию.

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

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT);
INSERT INTO products DEFAULT VALUES;

Вы можете вставить несколько строк в одну команду:

INSERT INTO products (product_no, name, price) VALUES
    (1, 'Cheese', 9.99),
    (2, 'Bread', 1.99),
    (3, 'Milk', 2.99);

Также можно вставить результат запроса (который может быть без строк, с одной строкой или со многими строками):

INSERT INTO products (product_no, name, price)
  SELECT product_no, name, price FROM new_products
    WHERE release_date = 'today';

Это обеспечивает полную мощность механизма SQL-запросов для вычисления вставляемых строк.

Обновление данных

Изменение данных, которые уже находятся в базе данных, называется обновлением. Вы можете обновить отдельные строки, все строки в таблице или подмножество всех строк. Каждый столбец можно обновлять отдельно; другие столбцы не затрагиваются.

Чтобы обновить существующие строки, используйте команду UPDATE . Для этого требуется три элемента информации:

  1. Имя таблицы и столбца для обновления
  2. Новое значение столбца
  3. Какие строки обновить

SQL, как правило, не предоставляет уникальный идентификатор для строк. Поэтому не всегда можно напрямую указать, какую строку следует обновить. Вместо этого вы указываете, каким условиям должна соответствовать строка, чтобы ее можно было обновить. Только если у вас есть первичный ключ в таблице (независимо от того, объявили вы его или нет), вы можете надежно обращаться к отдельным строкам, выбирая условие, соответствующее первичному ключу. Графические инструменты доступа к базе данных полагаются на этот факт, чтобы позволить вам обновлять строки по отдельности.

Например, эта команда обновляет все продукты с ценой 5 до цены 10:

UPDATE products SET price = 10 WHERE price = 5;

Это может привести к обновлению нуля, одной или многих строк. Попытка обновления, которая не соответствует ни одной строке, не является ошибкой.

Давайте рассмотрим эту команду подробно. Сначала идет ключевое слово UPDATE, за которым следует имя таблицы. Как обычно, имя таблицы может быть дополнено схемой, в противном случае оно ищется в пути. Далее идет ключевое слово SET, за которым следует имя столбца, знак равенства и новое значение столбца. Новое значение столбца может быть любым скалярным выражением, а не только константой. Например, если вы хотите поднять цену на все товары на 10%, вы можете использовать:

UPDATE products SET price = price * 1.10;

Как видите, выражение для нового значения может ссылаться на существующее значение(я) в строке. Мы также исключили этот WHEREпункт. Если он опущен, это означает, что все строки в таблице обновлены. Если оно присутствует, WHEREобновляются только те строки, которые соответствуют условию. Обратите внимание, что знак равенства в SETпредложении — это присваивание, а знак равенства в WHEREпредложении — сравнение, но это не создает никакой двусмысленности. Конечно, WHEREусловие не обязательно должно быть проверкой на равенство. Доступны многие другие операторы. Но выражение должно оцениваться как логический результат.

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

UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;

Удаление данных

До сих пор мы объясняли, как добавлять данные в таблицы и как изменять данные. Осталось обсудить, как удалить данные, которые больше не нужны. Точно так же, как добавление данных возможно только целыми строками, вы можете удалить только целые строки из таблицы. В предыдущем разделе мы объяснили, что SQL не позволяет напрямую обращаться к отдельным строкам. Следовательно, удаление строк может быть выполнено только путем указания условий, которым должны соответствовать удаляемые строки. Если у вас есть первичный ключ в таблице, вы можете указать точную строку. Но вы также можете удалить группы строк, соответствующих условию, или вы можете удалить все строки в таблице сразу.

Вы используете команду DELETE для удаления строк; синтаксис очень похож на команду UPDATE . Например, чтобы удалить из таблицы товаров все строки с ценой 10, используйте:

DELETE FROM products WHERE price = 10;

Если просто написать:

DELETE FROM products;

то все строки в таблице будут удалены! Внимание программист.

Возврат данных из измененных строк

Иногда полезно получать данные из измененных строк во время манипулирования ими. Все команды INSERT, UPDATEи DELETEимеют необязательное RETURNINGпредложение, поддерживающее это. Использование RETURNINGпозволяет избежать выполнения дополнительного запроса к базе данных для сбора данных и особенно ценно, когда в противном случае было бы трудно надежно идентифицировать измененные строки.

Допустимое содержимое RETURNINGпредложения такое же, как и SELECTв списке вывода команды. Он может содержать имена столбцов целевой таблицы команды или выражения значений, использующие эти столбцы. Распространенным сокращением является RETURNING *, который выбирает все столбцы целевой таблицы по порядку.

В INSERTфайле доступными данными RETURNINGявляется строка в том виде, в каком она была вставлена. Это не так полезно в тривиальных вставках, так как это просто повторит данные, предоставленные клиентом. Но это может быть очень удобно, когда вы полагаетесь на вычисленные значения по умолчанию. Например, при использовании serialстолбца для предоставления уникальных идентификаторов RETURNINGможет возвращаться идентификатор, присвоенный новой строке:

CREATE TABLE users (firstname text, lastname text, id serial primary key);

INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;

Предложение RETURNINGтакже очень полезно с INSERT ... SELECT.

В UPDATEобъекте доступными данными RETURNINGявляется новое содержимое измененной строки. Например:

UPDATE products SET price = price * 1.10
  WHERE price <= 99.99
  RETURNING name, price AS new_price;

В команде DELETE данные, выдаваемые в RETURNING, образуются содержимым удалённой строки. Например:

DELETE FROM products
  WHERE obsoletion_date = 'today'
  RETURNING *;

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