Чтение и запись данных

Запросы могут быть отправлены для выполнения в YDB следующими способами:

  • из консоли управления;
  • из приложения, написанного с использованием YDB SDK для Java, Python и Go.

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

Предварительные требования

Для выполнения запросов понадобится создать базу данных и схему.

Вставьте и измените данные

Для вставки данных в YDB используются инструкции REPLACE, UPSERT и INSERT.

При выполнении инструкций REPLACE и UPSERT осуществляется слепая запись. При выполениии инструкции INSERT перед операцией записи выполняется операция чтения данных. Это позволяет убедиться, что уникальность первичного ключа будет соблюдена.

Использование инструкций REPLACE и UPSERT предпочтительно при операциях записи и изменения данных.

Одним запросом REPLACE, UPSERT или INSERT можно вставить в таблицу несколько строк.

Важная информация

В консоль управления YQL включена PRAGMA AutoCommit. Это означает, что после каждого запроса автоматически будет выполняться COMMIT. Например, если вы введете несколько выражений (как показано в примере ниже) и выполните запрос, после запроса автоматически будет выполнен СOMMIT.

REPLACE INTO episodes (series_id, season_id, episode_id, title) VALUES (1, 1, 1, "Yesterday's Jam");
REPLACE INTO episodes (series_id, season_id, episode_id, title) VALUES (1, 1, 2, "Calamity Jen");

REPLACE

После создания таблиц series, seasons и episodes можно вставить данные в таблицу с помощью инструкции REPLACE. Базовый синтаксис:

REPLACE INTO имя_таблицы (список_столбцов) VALUES (список_добавляемых_значений);

Инструкция REPLACE используется для добавления новой или изменения существущей строки по заданному значению первичного ключа. Если строка с указанным значением первичного ключа не существует, она будет создана. Если строка уже существует, значения колонок существующей строки будут заменены новыми значениями. При этом значения колонок не участвующих в операции устанавливаются в значения по умолчанию. В этом заключается единственное отличие от инструкции UPSERT.

Примечание

При выполнении запроса осуществляется слепая запись. Для операций записи или изменения данных рекомендуется использовать инструкции REPLACE или UPSERT.

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

REPLACE INTO series (series_id, title, release_date, series_info)
VALUES
    (
        1,
        "IT Crowd",
        CAST(Date("2006-02-03") AS Uint64),
        "The IT Crowd is a British sitcom produced by Channel 4, written by Graham Linehan, produced by Ash Atalla and starring Chris O'Dowd, Richard Ayoade, Katherine Parkinson, and Matt Berry."),
    (
        2,
        "Silicon Valley",
        CAST(Date("2014-04-06") AS Uint64),
        "Silicon Valley is an American comedy television series created by Mike Judge, John Altschuler and Dave Krinsky. The series focuses on five young men who founded a startup company in Silicon Valley."
    )
    ;

REPLACE INTO seasons (series_id, season_id, title, first_aired, last_aired)
VALUES
    (1, 1, "Season 1", CAST(Date("2006-02-03") AS Uint64), CAST(Date("2006-03-03") AS Uint64)),
    (1, 2, "Season 2", CAST(Date("2007-08-24") AS Uint64), CAST(Date("2007-09-28") AS Uint64)),
    (2, 1, "Season 1", CAST(Date("2014-04-06") AS Uint64), CAST(Date("2014-06-01") AS Uint64)),
    (2, 2, "Season 2", CAST(Date("2015-04-12") AS Uint64), CAST(Date("2015-06-14") AS Uint64))
;

REPLACE INTO episodes (series_id, season_id, episode_id, title, air_date)
VALUES
    (1, 1, 1, "Yesterday's Jam", CAST(Date("2006-02-03") AS Uint64)),
    (1, 1, 2, "Calamity Jen", CAST(Date("2006-02-03") AS Uint64)),
    (2, 1, 1, "Minimum Viable Product", CAST(Date("2014-04-06") AS Uint64)),
    (2, 1, 2, "The Cap Table", CAST(Date("2014-04-13") AS Uint64))
;

UPSERT

Инструкция UPSERT используется для добавления новой или изменения существущей строки по заданному значению первичного ключа. Если строка с указанным значением первичного ключа не существует, она будет создана. Если строка уже существует, значения колонок существующей строки будут заменены новыми значениями. При этом значения колонок не участвующих в операции не изменяют свои значения. В этом заключается единственное отличие от инструкции REPLACE.

Примечание

При выполнении запроса осуществляется слепая запись. Для записи рекомендуется использовать инструкции REPLACE или UPSERT.

Код приведенный ниже вставит в таблицу episodes одну строчку с данными.

UPSERT INTO episodes
(
    series_id,
    season_id,
    episode_id,
    title,
    air_date
)
VALUES
(
    2,
    1,
    3,
    "Test Episode",
    CAST(Date("2018-08-27") AS Uint64)
)
;

INSERT

Инструкция INSERT используется для вставки одной или нескольких строк. При попытке вставить строку в таблицу с уже существующим значением первичного ключа, YDB вернёт ошибку с сообщением Transaction rolled back due to constraint violation: insert_pk..

Примечание

При выполнении операции INSERT перед записью осуществляется чтение данных. Это делает ее менее эффективной, чем операции REPLACE и UPSERT. Для записи рекомендуется использовать операции REPLACE или UPSERT.

Код приведенный ниже вставит в таблицу episodes одну строчку с данными.

INSERT INTO episodes
(
    series_id,
    season_id,
    episode_id,
    title,
    air_date
)
VALUES
(
    2,
    5,
    21,
    "Test 21",
    CAST(Date("2018-08-27") AS Uint64)
)
;

UPDATE

Инструкция UPDATE изменяет значения колонок для строк таблицы, отфильтрованных по предикату из условия WHERE. Базовый синтаксис:

UPDATE имя_таблицы SET имя_столбца1=новое_значение_столбца1, ... ,имя_столбцаN=новое_значение_столбцаN WHERE условия_для_фильтра_строк;

Значения первичного ключа в рамках инструкции UPDATE не могут быть изменены. Введите и выполните следующую инструкцию UPDATE, чтобы изменить значение столбца title для эпизода с значениями столбцов series_id = 2, season_id = 1и episode_id = 3 со значения "Test Episode" на значение "Test Episode Updated".

UPDATE episodes
SET title="Test Episode Updated"
WHERE
    series_id = 2
    AND season_id = 1
    AND episode_id = 3
;

DELETE

Инструкция DELETE удаляет строки таблицы, отфильтрованные по предикату из условия WHERE. Код приведенный ниже удалит из таблицы episodes эпизод со следующими значениями столбцов series_id = 2, season_id = 1, и episode_id = 3.

DELETE
FROM episodes
WHERE
    series_id = 2
    AND season_id = 5
    AND episode_id = 12
;

Запросите данные при помощи SELECT

Для чтения данных в таблице используется инструкция SELECT.

Чтобы запросить данные из таблицы series, выполните код представленный ниже.

SELECT
    series_id,
    title AS series_title,
    CAST (release_date AS Date) AS release_date
FROM series;

Чтобы выбрать все столбцы в таблице, можно использовать звездочку. Для того, чтобы получить значения всех столбцов из таблицы series, выполните код представленный ниже.

SELECT
    *
FROM series;

Примечание

Подробнее о том, как запросить данные по вторичному индексу, читайте в разделе SELECT по вторичному индексу.

Сделайте параметризированный запрос

Использование параметризованных запросов может улучшить производительность за счет сокращения частоты выполнения компиляции и перекомпиляции запросов.

Пример

DECLARE $seriesId AS Uint64;
DECLARE $seasonId AS Uint64;

$seriesId = 1;
$seasonId = 2;

SELECT sa.title AS season_title, sr.title AS series_title
FROM seasons AS sa
INNER JOIN series AS sr
ON sa.series_id = sr.series_id
WHERE sa.series_id = $seriesId AND sa.season_id = $seasonId;

Примечание

YDB использует механизм оптимистичных блокировок. Для того, чтобы блокировки транзакций реже инвалидировались с ошибкой Transaction locks invalidated следует использовать короткие транзакции.