Разработка
Подкатегория
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
-- Абсолютные значения abs()
SELECT abs(NULL);
SELECT abs(TRUE);
SELECT abs(-99);
SELECT abs(-99.01);
SELECT abs(-99.0);
SELECT abs(123.123);
SELECT abs(0);
SELECT abs('string');
SELECT abs(45-100);
-- Максимальное значение max(x1,x2,x3,x4,x5...)
SELECT max('a','b','c');
SELECT max('azzzzzz','bbbb','ccdcdcd');
SELECT max('a','B','C');
SELECT max('a','B','C', NULL);
SELECT max('a','B','C', 12);
SELECT max(99,123,1111111,10000000000);
-- Минимальное значение min(x1,x2,x3,x4,x5...)
SELECT min('a','b','c');
SELECT min('azzzzzz','bbbb','ccdcdcd');
SELECT min('a','B','C');
SELECT min('a','B','C', NULL);
SELECT min('a','B','C', 129999999999999999999999999);
SELECT min(99,123,1111111,10000000000);
-- Подучить случайное значение random(): -9223372036854775808 и +9223372036854775807.
SELECT random();
SELECT random();
SELECT random();
SELECT random()*0.00001;
SELECT random()*0.00000001;
SELECT abs(random())*0.00000001;
-- Округление чисел round(число, точность округления)
SELECT round(123);
SELECT round(123.123);
SELECT round(123.423);
SELECT round(123.523);
SELECT round(123.523, 2);
SELECT round(123.523, 1);
SELECT round(123.523, 3);
SELECT round(123.5237, 3);
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
-- Конкатенация при помощи оператора ||
SELECT 'Привет,' || ' мир!';
SELECT 'Привет,' || ' ' || 'мир!';
-- Кавычки можно экранировать другими кавычками
SELECT '''Привет,'''|| ' мир!';
-- Или использовать другой вид кавычек
SELECT "'Привет, '" || '"мир!"';
-- Поиск вхождения подстроки в строку instr
-- Функция работает начиная с SQLite 3.7.15
SELECT instr('Привет, миР!', 'П');
SELECT instr('Привет, миР!', 'Р');
SELECT instr('Привет, мир!', 'р');
SELECT instr('Привет, миР!', 'вет');
SELECT instr('Привет, миР!', 'г');
-- если строки с типом BLOB, то функция возвращает число байт до первого вхождения подстроки плюс один байт
-- Как узнать длину строки length
SELECT length(543);
SELECT length('543');
SELECT length(9);
SELECT length('string');
SELECT length(NULL);
SELECT length(TRUE);
SELECT length('');
SELECT length(' ');
-- для BLOB строк возвращает не количество символов, а количество байт
-- Перевод строки в нижний регистр lower
-- Функция работает только для символов ASCII, для других того, чтобы обеспечить поддержку других символовов,
-- воспользуйтесь расширением ICU.
SELECT lower('Привет, миР!');
SELECT lower('ПРИВЕТ, МИР!!!');
SELECT lower('Hello');
SELECT lower('HELLO');
-- Отрезать символы слева ltrim
SELECT ltrim(' Привет, мир!');
SELECT ltrim(' Привет, мир!');
SELECT ltrim(' Привет, мир! ');
SELECT ltrim(' Привет, мир! Еще одна часть строки ');
SELECT ltrim(' ааааббббвввв', 'а');
SELECT ltrim('абвабвпетя абв', 'абв');
SELECT ltrim('абвабввввввПетя абв', 'абв');
SELECT ltrim(' 3453462000абвабввввввПетя абв', '0123456789');
-- Замена подстроки в строке replace
replace(строка, удаляемая подстрока, вставляемая подстрока )
SELECT replace('Привет, мир!', 'мир', 'Вася');
SELECT replace('Привет, Мир!', 'мир', 'Вася');
SELECT replace('Привет, Мир!', 'Мир', 'Вася');
SELECT replace('абв абв абв', 'а', 'К');
SELECT replace('абв абв абв', 'А', 'К');
SELECT replace('123 123 123', 2, 5);
SELECT replace('123 123 123', '2', '5');
-- Отрезать символы справа rtrim
SELECT rtrim('Привет, мир! ');
SELECT rtrim(' Привет, мир! ');
SELECT rtrim(' Привет, мир! еще немного текста ');
SELECT rtrim('1230000', 0);
SELECT rtrim('1230000', '0');
-- Получить подстроку substr
substr(строка, стартовая позиция, [ длина подстроки ] )
SELECT substr('Привет, мир!', 1, 3);
SELECT substr('Привет, мир!', 1);
SELECT substr('Привет, мир!', 5);
SELECT substr('Привет, мир!', -1, 3);
SELECT substr('Привет, мир!', 4);
SELECT substr('Привет, мир!', 4, 2);
SELECT substr('Привет, мир!', -4, 2);
SELECT substr('Привет, мир!', -1, 1);
-- Обрезать символы trim
SELECT trim(' Привет, мир!');
SELECT trim(' Привет, мир! ');
SELECT trim(' Привет, мир! Еще одна часть строки ');
SELECT trim('ааааббббвввв ааа', 'а');
SELECT trim(' ааааббббвввв ааа', 'а');
SELECT trim('абвабвпетя ттт абв', 'абв');
SELECT trim('абвабввввввПетя абв', 'абв');
SELECT trim('3453462000абвабввввввПетя абв', '0123456789');
-- Перевести строку в верхний регистр upper
-- Функция работает только для символов ASCII, для других того, чтобы обеспечить поддержку других символовов,
-- воспользуйтесь расширением ICU.
SELECT upper('Привет, миР!');
SELECT upper('привет, мир!!!');
SELECT upper('hello');
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
SELECT coalesce('привет!', 1, 3, 'Вася', NULL);
SELECT coalesce(NULL, 12,'привет!', 1, 3, 'Вася', NULL);
SELECT coalesce(NULL, NULL, NULL, 1);
SELECT ifnull(NULL, '2014-10-31');
SELECT ifnull(NULL, NULL);
SELECT ifnull(99, NULL);
SELECT nullif(1, 2);
SELECT nullif(2, 'строка');
SELECT nullif('строка', 2);
SELECT nullif('строка', 'строка');
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
-- Функции агрегации
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
pro TEXT NOT NULL,
sex TEXT NOT NULL,
sal REAL CHECK (sal (знак больше) 15000)
);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Пупкин Матвей', 'Дантист', 'м', 55000.00);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Cумкин Денис', 'Юрист', 'м', 35040.90);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Иван Иванов', 'Младший юрист', 'м', 16000.00);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Ирина Маркова', 'Бухгалтер', 'ж', 31200.10);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Алина Петрова', 'Менеджер продаж', 'ж', 21200.10);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Любовь Михайлова', 'Секретарь', 'ж', 16200.10);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Инна Сидорова', 'Руководитель отдела обслуживания', 'ж', 66200.10);
-- avg(x)
SELECT avg(sal) FROM users;
-- count(X)
-- count(*)
SELECT count(*) FROM users;
SELECT count(name) FROM users;
-- group_concat(X)
-- group_concat(X,Y)
SELECT group_concat(name) FROM users;
SELECT group_concat(name, '|') FROM users;
-- max(X)
SELECT max(sal) FROM users;
-- min(X)
SELECT min(sal) FROM users;
-- sum(X)
-- total(X)
SELECT sum(sal) FROM users;
SELECT total(sal) FROM users;
-- Основная разница между функциями в том, что total возвращает в качестве результата число с плавающей точкой всегда
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/chast-11
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
-- SQL команды CREATE INDEX и DROP INDEX
-- Давайте посмотрим, как создавать индексы для таблиц базы данных под управлением SQLite
-- Хотя мы уже много раз создавали индексы в базах данных,
-- когда объявляли ограничение первичного ключа для столбца – PRIMARY KEY
-- Но индексы можно создавать явно при помощи команды CREATE INDEX, вот ее синтаксис:
CREATE INDEX IF NOT EXISTS dbname.ixname ON tblname (columnname, columnname2,...) WHERE…
-- ключевое слово ON, после которого указывается имя таблицы, для которой будет создан индекс.
-- После имени таблицы в круглых скобках указывается имя столбца этой таблицы, который будет
-- проиндексирован, заметьте, что индексируемых столбцов можем быть несколько, в этом случае они разделяются запятой.
-- После имени столбца можно использовать клаузулу WHERE,
-- которая позволяет задать определенные условия для создания индекса.
-- Удаляем индекс мы как и любой другой объект при помощи команды DROP
DROP INDEX IF EXISTS dbname.ixname;
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
pro TEXT NOT NULL,
sex TEXT NOT NULL,
sal REAL CHECK (sal (знак больше) 15000)
);
CREATE INDEX IF NOT EXISTS iXname ON users (name);
DROP INDEX IF EXISTS ixname;
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/chast-11
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
-- Композитные и частичные индексы в базах данных SQLite
/*
Мы упоминали о том, что SQLite позволяет создавать несколько индексов для одной таблицы в базе данных,
давайте разберемся с синтаксисом создания нескольких индексов для одной таблицы, такие индексы еще называют
композитными:
*/
CREATE INDEX ix1_table1 ON table1 (a);
CREATE INDEX ix1_table1 ON table1 (a, b);
/*
Создание нескольких индексов для одной таблицы ничем принципиально не отличается от создания одного
индекса: мы просто перечисляем столбцы в круглых скобках, которые будут проиндексированы.
*/
-- Для составных индексов имеет значение то, как и в каком порядке указаны имена столбцов при создании индекса. Если индекс состоит из столбцов col1 и col2, то он может быть применен только в запросе где в критериях используются оба этих поля.
SELECT col1, col2 FROM table1;
SELECT col1, col3, col4 FROM table1;
-- В большинстве случаев индекс по одному столбцу будет работать достаточно хорошо и сэкономит время и место. Индексы по более чём трём столбцам вряд ли будут полезными, если только таблица не используется крайне однообразно
/*
Но SQLite дает возможность создавать индексы не для всех значений столбца (не для всех строк в таблице),
а только частичные индексы. Частичные индексы создаются путем наложения определенных
условий на значения, хранящиеся в столбце при помощи клаузулы WHERE:
*/
col1
1
2
3
4
5
6
null
8
12
null
45
null
null
CREATE INDEX partInd_table1 ON table1 (col1)
WHERE col1 IS NOT NULL;
/*
Мы знаем, что в SQLite значение с типом данных NULL всегда уникально, так как значение с классом данных NULL
не равно даже другому NULL, в данном случае будет создан частичный индекс для всех строк столбца, кроме тех строк,
у которых в столбце column_name хранится значение NULL.
*/
-- Частичные индексы экономят место на вашем сервере в том случае, если индексируемый столбец имеет много значений NULL или в столбце много повторяющихся одинаковых значений (вы просто исключаете эти повторяющиеся значения из индекса,поскольку при огромном количестве одинаковых значений будет все равно происходить "тупой" перебор).
-- Используя частичные индексы в вышеописанных случаях вы ускоряете процесс выборки данных и при этом операции, связанные с изменением данных не так сильно "тормозят".
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/chast-11
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
-- Использование индексов в базах данных SQLite. Уникальные индексы. Переиндексация таблиц.
-- Можем убедиться в том, что индекс для таблицы table1 действительно существует и в том,
-- что это столбец «а», воспользуемся командой PRAGMA
PRAGMA index_list(users);
-- еще можно так:
.indices
.indices users
SELECT * FROM sqlite_master WHERE type = 'index';
/*
Но SQLite позволяет создавать индексы с ограничение уникальности, давайте создадим индекс в базе данных,
значения которого должны быть уникальными, обратите внимание: индекс не будет являться ключевым атрибутом
таблицы, он будет просто уникальным:
*/
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
pro TEXT NOT NULL,
sex TEXT NOT NULL,
sal REAL CHECK (sal (знак больше) 15000)
);
CREATE UNIQUE INDEX iXname ON users (name);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Пупкин Матвей', 'Дантист', 'м', 55000.00);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Cумкин Денис', 'Юрист', 'м', 35040.90);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Иван Иванов', 'Младший юрист', 'м', 16000.00);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Ирина Маркова', 'Бухгалтер', 'ж', 31200.10);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Алина Петрова', 'Менеджер продаж', 'ж', 21200.10);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Любовь Михайлова', 'Секретарь', 'ж', 16200.10);
INSERT INTO users (name, pro,sex, sal)
VALUES ('Инна Сидорова', 'Руководитель отдела обслуживания', 'ж', 66200.10);
-- дублирующееся значение
INSERT INTO users (name, pro,sex, sal)
VALUES ('Пупкин Матвей ', 'Дантист', 'м', 55000.00);
/*
В базах данных SQLite нельзя применять к индексу команду ALTER, то есть никаких изменений в структуру
индекса вы внести не сможете. Поэтому для переименования индекса в базах данных SQLite вам необходимо
сперва удалить старый индекс, а затем создать новый.
*/
/*
Но иногда бывает необходимость сделать переиндексацию таблиц.
Переиндексация полезна в том случае, когда изменился порядок сортировки данных в столбце,
который объявлен, как индекс таблицы. Общий синтаксис переиндексации данных в базах данных под
управлением SQLite выглядит так:
*/
REINDEX tblname;
REINDEX table1;
REINDEX table2;
REINDEX table3;
-- допустим и такой вариант
REINDEX indexname1;
REINDEX indexname2;
/*
У нас есть два варианта переиндексации таблиц, если мы указываем имя таблицы, то
SQLite сделает переиндексацию для всех столбцов таблицы, которые указаны, как индекс.
Если мы делаем переиндексацию, указывая имя индекса, то значения последовательность
будет удалена и сформирована заново для конкретного индекса.
*/
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/chast-11
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
-- Когда не нужно использовать индексы в базах данных
/*
Индексы – очень мощный и полезный инструмент в базах данных, в том числе и в базах данных под управлением SQLite. Индексы в базах данных создаются для того, чтобы ускорить операции выборки данных, обычно реляционные СУБД создают отдельные таблицы, в которых они хранят значения проиндексированных столбцов в упорядоченном виде, поэтому создание индексов – это всегда расширение и увеличение ваших баз данных.
Индексы удобны и хороши, но бывают ситуации, когда индексы не стоит использовать, например:
Если у вас небольшая база данных с небольшим количеством строк в таблицах, то индексы не стоит использовать, так как никаких преимуществ от индексов вы не получите.
Если у вас есть таблицы, в которых вы часто производите операции модификации данных, то индексы не стоит использовать, так как они очень сильно замедлять операции обновления данных, выполняемых командой UPDATE.
Если вы часто добавляете новые строки в таблицы базы данных (часто используете команду INSERT), то для таблиц, которым много SQL запросов INSERT не стоит создавать индексы, так как SQLite будет постоянно переформировывать индексные таблицы, из-за чего скорость операции INSERT очень уменьшится.
Если в вашей таблице есть столбцы, в которых много NULL значений, то такие столбцы лучше не использовать, как индексы, значения NULL могут лишить вас тех преимуществ, что дают индексы в базах данных.
Если в таблице есть столбцы, с которыми вы часто производите операции манипуляции данными, то не используйте их, как индексы. При каждом изменение столбца SQLite, как и любая другая СУБД, будет пересчитывать индексы.
*/
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/chast-11
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
-- Столбец ROWID или внутренние индексы таблицы в базе данных SQLite
-- У каждой таблицы базы данных SQLite по умолчанию есть внутренний индекс, который называет ROWID. Иногда этот индекс совпадает с первичным ключом таблицы PRIMARY KEY, иногда не совпадает, но ROWID есть у каждой таблицы. Если говорить просто и понятно, то ROWID – это дополнительный столбец, который есть у любой таблицы SQLiteи является индексом для данной таблицы.
-- Помимо того, что ROWID – это индекс, это еще один способ поддержание целостности данных. Давайте разберемся с индексом ROWID в базах данных SQLite. ROWID–это 64-разрядное число, которое однозначно идентифицирую любую строку в базе данных SQLite.
-- Создадим таблицу без индексов и наполним ее данными
CREATE TABLE table1(a, b ,c ,d);
INSERT INTO table1 (a, b, c , d)
VALUES (1, 2, 3, 4);
INSERT INTO table1 (a, b, c , d)
VALUES (1, 2, 3, 4);
INSERT INTO table1 (a, b, c , d)
VALUES (1, 2, 3, 4);
INSERT INTO table1 (a, b, c , d)
VALUES (1, 2, 3, 4);
-- посмотрим содержимое таблицы
SELECT*FROM table1;
-- SQLite не показывает столбец ROWID, если не обращаться к нему по имени, давайте изменим наш запрос SELECT
SELECT rowid, a, b, c, d FROM table1;
SELECT rowid, a FROM table1;
-- Чтобы первичный ключ совпадал с ROWID, нужно создать таблицу следующим образом
CREATE TABLE table1(x INTEGER PRIMARY KEY ASC, y, z);
CREATE TABLE table2(x INTEGER, y, z, PRIMARY KEY(x ASC));
CREATE TABLE table3(x INTEGER, y, z, PRIMARY KEY(x DESC));
-- Обратите внимание: если столбец PRIMARY KEY объявить как-нибудь по-другому, то значения PRIMARY KEY и ROWID совпадать не будут.
-- Таблицы WITHOUT ROWID в базах данных SQLite, таблицы без внутренних индексов
-- В SQLite можно создавать таблицы без столбца ROWID, то есть без внутреннего индекса. Такой подход несет незначительные плюсы: иногда это ускоряет выборку данных из базы данных и немного уменьшает объем базы данных. Если вы решили создать таблицу без ROWID в SQLite, то вам необходимо сделать две вещи: во-первых, у таблицы должен быть обязательно первичный ключ, во-вторых, вам необходимо использовать ключевую фразу WITHOUT ROWID.
CREATE TABLE IF NOT EXISTS wordcount(
word TEXT PRIMARY KEY,
cnt INTEGER
) WITHOUT ROWID;
INSERT INTO wordcount (word, cnt)
VALUES ('word1', 2);
INSERT INTO wordcount (word, cnt)
VALUES ('word2', 5);
INSERT INTO wordcount (word, cnt)
VALUES (NULL, 5);
CREATE TABLE IF NOT EXISTS wordcount1(
word TEXT PRIMARY KEY,
cnt INTEGER
);
INSERT INTO wordcount1 (word, cnt)
VALUES (NULL, 5);
-- Теперь у таблицы не будет столбца ROWID. Еще одной особенностью таблиц WITHOUT ROWID является то, что ограничение уровня столбца AUTOINCREMENT работать не будет. Первичный ключ таблицы WITHOUT ROWID ни при каких обстоятельствах не может иметь значение NULL, если вы попробуете добавить NULL в столбец PRIMARY KEY таблицы WITHOUT ROWID, то SQLite выдаст ошибку.
Из-за особенностей работы таблиц WITHOUT ROWID, разработчики SQLiteрекомендуют использовать такие таблицы в тех случаях, когда:
Вы используете составные первичные ключи или когда первичный ключ не является целым числом, а имеет другой тип данных.
Если вам нужно повысить скорость работы таблицы с первичным ключом INTEGER, создавайте таблицу без внутреннего индекса, этим вы ускорите выборку и уменьшите объем базы данных. Если таблицы имеет индекс ROWID и индекс в виде INTEGER PRIMARY KEY, то SQLIte делает перебор двумя циклами: первый цикл идет по столбцу ROWID, второй цикл идет по столбцу INTEGER PRIMARY KEY, хотя значения этих столбцов совпадают.
Если в таблицах хранится небольшое количество строк, то таблицы без индекса (WITHOUT ROWID) будут работать несколько быстрее, чем со столбцом ROWID.
Если вы проектируете базу данных и хотите ее оптимизировать, то вам не стоит задумываться о том, какие таблицы использовать: ROWID или WITHOUT ROWID, на этапе разработки и проектирования. Тесты лучше всего проводить после того, как база данных будет спроектирована и реализована. Так как никаких отличий между таблицами с ROWID и без нет, за исключением тех, что описаны выше, нет.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/chast-11
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-m...
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-16-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
1. Управление пользователями в базах данных SQLite.
2. Три способа создать базу данных в SQLite.
3. Как удалить базу данных в SQLite.
4. SQL команда ATTACH DATABASE или как подключить базу данных.
5. SQL команда DETACH DATABASE или как отключить базу данных.
6. SQL команда VACUUM: повторная сборка или дефрагментация базы данных SQLite.
7. Как сделать резервную копию базы данных SQLite. Бэкап базы данных SQLite.
8. Импорт баз данных SQLite.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-m...
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-16-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-m...
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-16-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-m...
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-16-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-13-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
-- SQL событие BEFORE
-- В SQLite нет табличных триггеров, а есть только триггеры строчные,
-- то есть FOR EACH ROW триггеры, которые срабатывают при изменении каждой строки в таблице.
-- Давайте напишем триггер, который будет срабатывать
-- при вставке данных в базу данных, до того, как будет выполнена операция вставки.
-- Создадим две таблицы
CREATE TABLE users(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL,
address TEXT NOT NULL,
mydate TEXT NOT NULL
);
CREATE TABLE user_log (
Id_u INTEGER NOT NULL,
u_date TEXT NOT NULL
);
-- Для наполнения второй таблицы мы будем использовать триггер
CREATE TRIGGER my_u_log BEFORE INSERT
ON users
BEGIN
INSERT INTO user_log(id_u, u_date) VALUES (NEW.id, datetime('now'));
END;
-- Проверим работу триггера
INSERT INTO users(name, age, address, mydate)
VALUES ('Пупкин', 27, 'Адрес', datetime('now'));
SELECT * FROM users;
SELECT * FROM user_log;
-- К сожалению, поле date в данном случае не показывает, что вставка данных в таблицу user_log произошла до того, как были вставлены данные в таблицу users. Но этот факт мы можем заметить по значению столбца id_u, которое равно -1, так как SQLite3 просто не знает: какое значение будет в столбце id таблицы users.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-13-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
-- SQL событие AFTER
-- Давайте теперь изменим наш пример, таблица останется той же, но мы изменим код триггера, только одну его часть: поменяем BEFORE на AFTER, чтобы посмотреть, как сработает триггер после выполнения запроса:
-- Создадим две таблицы
CREATE TABLE users(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL,
address TEXT NOT NULL,
mydate TEXT NOT NULL
);
CREATE TABLE user_log (
Id_u INTEGER NOT NULL,
u_date TEXT NOT NULL
);
CREATE TRIGGER my_u_log AFTER INSERT
ON users
BEGIN
INSERT INTO user_log(id_u, u_date) VALUES (NEW.id, datetime('now'));
END;
-- Сделаем проверку
INSERT INTO users(name, age, address, mydate)
VALUES ('Пупкин', 27, 'Адрес', datetime('now'));
INSERT INTO users(name, age, address, mydate)
VALUES ('Сумкин', 17, 'Адрес2', datetime('now'));
SELECT * FROM users;
SELECT * FROM user_log;
-- Теперь идентификаторы записываются корректно во вторую таблицу. Обратите внимание на модификатор NEW. Модификатор NEW – это ключевое слово, которое используется в теле триггера для того, чтобы сказать СУБД о том, что нужно брать новые значения (значение, которое мы добавляем в таблицу или модифицированный вариант значения). Надеюсь, что вы разобрались в разнице между BEFORE и AFTER.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-13-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
-- INSERT и DELETE триггеры
DROP TABLE users;
DROP TABLE user_log;
CREATE TABLE users(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL,
address TEXT NOT NULL,
mydate TEXT NOT NULL
);
CREATE TABLE user_log (
Id_u INTEGER NOT NULL,
u_date TEXT NOT NULL,
operation TEXT NOT NULL
);
-- Мы добавили столбец operation, в котором будем хранить информацию о том, что мы сделали с пользователем: удалили или добавили.
-- Напишим новый INSERT триггер, который будет учитывать новый столбец
CREATE TRIGGER my_u_log AFTER INSERT
ON users
BEGIN
INSERT INTO user_log(id_u, u_date, operation) VALUES (NEW.id, datetime('now'),'ins');
END;
-- Напишем триггер, который будет срабатывать по событию удаления строк
CREATE TRIGGER after_delete AFTER DELETE
ON users
BEGIN
INSERT INTO user_log(id_u, u_date, operation) VALUES (OLD.id, datetime('now'), 'del');
END;
-- Сделаем проверку
INSERT INTO users(name, age, address, mydate)
VALUES ('Пупкин', 27, 'Адрес', datetime('now'));
INSERT INTO users(name, age, address, mydate)
VALUES ('Сумкин', 17, 'Адрес2', datetime('now'));
INSERT INTO users(name, age, address, mydate)
VALUES ('Иванов', 37, 'Адрес3', datetime('now'));
INSERT INTO users(name, age, address, mydate)
VALUES ('Петров', 47, 'Адрес4', datetime('now'));
INSERT INTO users(name, age, address, mydate)
VALUES ('Сидоров', 57, 'Адрес5', datetime('now'));
INSERT INTO users(name, age, address, mydate)
VALUES ('Парамонов', 7, 'Адрес6', datetime('now'));
DELETE FROM users WHERE id = 4;
SELECT * FROM user_log;
SELECT * FROM users;
-- давайте обратим внимание на код триггера AFTER DELETE, в котором мы использовали модификатор OLD, модификатор OLD в SQL и SQLite используется в коде триггера для того, чтобы обратиться к старому значению или к значению, которое хранится в таблице (значение, которое будет изменено или модифицировано).
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-13-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
-- UPDATE триггеры
CREATE TRIGGER after_update AFTER UPDATE
ON users
BEGIN
INSERT INTO user_log(id_u, u_date, operation) VALUES (OLD.id, datetime('now'), 'upd');
END;
UPDATE users SET name = 'Марков'
WHERE id = 6;
SELECT * FROM user_log;
SELECT * FROM users;
-- Обратите внимание: триггер модификации или UPDATE триггер может отслеживать изменения не только для всей таблицы, но и для какого-то конкретного столбца, чтобы указать столбец, который будет отслеживать триггер модификации, используйте следующий синтаксис:
CREATE TRIGGER trigg_name AFTER UPDATE
OF (column1, column2)
BEGIN
-- тело триггераы
END;
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-13-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
-- Условия срабатывания триггера WHEN
CREATE TRIGGER when_insert AFTER INSERT
ON users WHEN (SELECT count(*) FROM user_log) (знак больше) 21
BEGIN
DELETE FROM user_log WHERE u_date = (SELECT min(u_date) FROM user_log);
INSERT INTO user_log(id_u, u_date, operation) VALUES (NEW.id, datetime('now'), 'ins');
END;
-- Этот триггер делает очень простую вещь: он ограничивает количество записей в логе до двадцати одной. То есть в таблице user_log будет храниться информация не обо всех модификациях, а только о последних, понятно, что количество записей в таблице можно регулировать.
-- Попробуйте реализовать данный триггер, чтобы посмотреть, как работает условие WHEN. В теле триггера выполняется две операции: первая удаляет лишнюю строку из лог-таблицы, вторая добавляет новую строку в таблицу лога.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-13-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
-- Некоторые особенности триггеров в базах данных SQLite
/*
Ранее мы говорили, что в теле триггера можно использовать любую команду манипуляции данных с довольно полным синтаксисом. Но ключевая часть выражения здесь: довольно полный синтаксис. Всё дело в том, что синтаксис команд манипуляции данными в теле триггера SQLite поддерживается не полностью. Итак, ваш триггер не будет создан/не будет работать если:
В теле триггера вы не можете использовать квалификаторы для обращения к таблицам базы данных. Можно использовать только имена таблиц.
Когда в деле триггера вы выполняете операцию INSERT, то вы не можете добавлять значения DEFAULT. Добавляемые значения должны быть явно указаны.
Нельзя использовать ключевые слова INDEX BY и NOT INDEXED в командах UPDATE и DELETE.
Клаузулы LIMIT и ORDER BY нельзя использовать с командами UPDATE и DELETE в теле триггера.
Вот такие ограничения накладывает SQLite на команды SQL, которые мы можем использовать в теле триггера.
*/
-- Посмотреть триггеры в БД SQLite
SELECT name FROM sqlite_master
WHERE type = 'trigger';
-- Триггеры для какой-то опредленной таблицы
SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'users';