мета-данные страницы
Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия | |||
некоторые_особенности_firebird [01.04.2022 17:25] OLDest |
некоторые_особенности_firebird [01.04.2022 17:35] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Некоторые особенности FireBird ====== | ||
- | === Активная работа с жестким диском === | ||
- | FireBird пишет в файл базы данных "по каждому чиху". Это связано с тем что FB не имеет журнала транзакций, в отличии от MS SQL. На современном оборудовании (SSD диски) это не оказывает никакого влияния. | ||
- | |||
- | === Зацикливание === | ||
- | |||
- | <code sql> | ||
- | INSERT INTO TABLE1 SELECT * FROM TABLE1 | ||
- | </code> | ||
- | В версии FireBird до 3 сработает и повесит его наглухо. Будьте внимательны | ||
- | |||
- | === Транзакция по умолчанию - это SNAPSHOT === | ||
- | |||
- | Если в транзакции READ COMMITED выполнить запрос | ||
- | <code>SELECT * FROM TABLE1</code> | ||
- | из таблицы с большим числом записей и не спеша двигаться в конец таблицы, то мы запросто может встретить новые записи, добавленные в таблицу после выполнения указанного SELECT-запроса.\\ | ||
- | Таким образом, SELECT-запрос в рамках транзакции READ COMMITED не является "атомарным".Но кто сказал, что SELECT-запрос должен быть во всех случаях "атомарным"? В данном вопросе каждая СУБД поступает так, как считает правильным.\\ | ||
- | Для Firebird транзакция по умолчанию - это SNAPSHOT, и здесь SELECT-запрос является атомарным на 100%! | ||
- | |||
- | === FIRST, SKIP и ROWS === | ||
- | |||
- | //FIRST и SKIP используются только в Firebird, они не | ||
- | включены в стандарт SQL. Рекомендуется использовать ROWS везде, где | ||
- | это возможно.// \\ | ||
- | \\ | ||
- | Выражение FIRST <число записей> ограничивает результирующий набор | ||
- | данным указанным числом записей.\\ | ||
- | Выражение SKIP <число записей> пропускает указанное число записей | ||
- | перед выдачей результирующего набора данных.\\ | ||
- | Когда эти выражения используются совместно, например FIRST m SKIP | ||
- | n, то в результате n записей будет пропущено и, из оставшихся, m записей | ||
- | будет возвращено в результирующем наборе данных.\\ | ||
- | FIRST и SKIP являются необязательными выражениями\\ | ||
- | \\ | ||
- | Синтаксис:\\ | ||
- | <code> | ||
- | SELECT | ||
- | [FIRST <m>] [SKIP <n>] | ||
- | FROM ... | ||
- | ... | ||
- | <m>, <n> ::= integer literal | ||
- | | query parameter | ||
- | | (integer-expression) | ||
- | </code> | ||
- | или\\ | ||
- | <code> | ||
- | SELECT | ||
- | ... | ||
- | FROM ... | ||
- | ... | ||
- | ROWS m [TO n] | ||
- | m, n ::= integer-expression | ||
- | </code> | ||
- | \\ | ||
- | Типичные ошибки\\ | ||
- | 1. Пытаемся удалить первые 10 записей\\ | ||
- | <code> | ||
- | DELETE FROM MYTABLE | ||
- | WHERE ID IN (SELECT FIRST 10 ID FROM MYTABLE) | ||
- | </code> | ||
- | В итоге получим пустую таблицу. Подзапрос будет выбирать каждый раз по 10 записей и они будут удаляться\\ | ||
- | 2.В некоторых случаях IN=EXIST\\ | ||
- | <code> | ||
- | WHERE F1 IN (SELECT FIRST 5 F2 | ||
- | FROM TABLE2 | ||
- | ORDER BY 1 DESC) | ||
- | </code> | ||
- | = | ||
- | <code> | ||
- | WHERE EXISTS (SELECT * F2 | ||
- | FROM TABLE2 | ||
- | WHERE TABLE2.F2 = TABLE1.F2 | ||
- | ORDER BY 1 DESC) | ||
- | </code> | ||
- | === Order by 1,2,3,4 === | ||
- | В конструкцию **Order by** и **Group by** вместо названия полей в сортировке можно подставлять их порядковый номер. Не не забывайте, чем больше полей в запросе тем труднее потом искать. | ||
- | <code> | ||
- | select id, name, adress, inn | ||
- | from table1 | ||
- | order by 1,2,4 | ||
- | </code> | ||
- | === Объединение значений в строку === | ||
- | В стандарте T-SQL для объединения текстовых строковых аргументов используется функция CONCAT, в FierBird используется две вертикальные черты || | ||
- | <code> | ||
- | select name||' '||adress | ||
- | from table 1 | ||
- | </code> | ||
- | Результат | ||
- | <code> | ||
- | Имя Адрес | ||
- | </code> | ||
- | Значение может быть текстовым, числовым или датой. Но с датой будут свои особенности\\ | ||
- | {{:pasted:20220401-172318.png}} | ||
- | например нам нужно вывести дату когда был оформлен выезд и адрес склада в одном поле. | ||
- | <code> | ||
- | select mp.dttm||' '||mp.address from | ||
- | mobile_plan mp | ||
- | </code> | ||
- | результат будет таким:\\ | ||
- | {{:pasted:20220401-172534.png}} |