суббота, 17 августа 2019 г.

X-Plane Отображение пакетов сценариев - новые правила

X-Plane Отображение пакетов сценариев - новые правила
Опубликовано 21 сентября 2012

Ben Supnik

 https://developer.x-plane.com/2012/09/scenery-packs-the-new-rules/

Правила расстановки приоритетов для пакетов с пейзажами изменились! Пожалуйста, прочитайте это внимательно!
Правила

Старый: Пакеты декораций загружаются в алфавитном порядке по имени.

Новое: пакеты с декорациями загружаются в соответствии с файлом .ini в Custom Scenery

Это почти все, что нужно помнить. Файл .ini означает, что вы можете организовать свой пейзаж, переупорядочив файл .ini, а не переименовывая пакеты. Это, в свою очередь, означает, что вам не нужно беспокоиться о сумасшедших именах, таких как a_Overlay b_SecondOverlay, и вам не нужно массово переименовывать множество пакетов, чтобы получить правильные имена.

Если вам не нужны наши пейзажи, отключите их в файле .ini (заменив SCENERY_PACK на SCENERY_PACK_DISABLED). Установщик не будет перезагружать их.

INI-файл устанавливает основу для будущего пользовательского интерфейса или сторонних утилит, которые редактируют приоритеты, и установщиков, которые могут устанавливать собственные приоритеты.

Как пакеты добавляются

При запуске X-Plane все пакеты, найденные в Custom Scenery, но не в INI-файле, добавляются в начало INI-файла. Если найдено более одного «нового» пакета, новые пакеты добавляются в алфавитном порядке (но все же перед каждым старым пакетом).

Любой отсутствующий пакет пейзажей удаляется из INI-файла при запуске X-Plane.

Это означает несколько вещей:

Если наложение не имеет высокого приоритета, вы можете удалить его, запустить X-Plane, затем вернуть его обратно и запустить X-Plane. Это перемещает это к вершине списка. (Или просто отредактируйте файл .ini - что, вероятно, проще.)

Если вы просто хотите в алфавитном порядке, удалите весь файл .ini - каждый пакет будет добавлен при следующем запуске сим в алфавитном порядке.

суббота, 25 мая 2019 г.

Регулирование смеси двигателя в в симуляторе

EGT, ROP и LOP



Что такое индикатор EGT? EGT соответствует температуре выхлопных газов. Прибор, который у нас есть в кабине, является своего рода термометром, который показывает температуру выхлопных газов двигателя.
Все, что вам нужно знать, это то, что каждая маленькая отметка (деление) над шкалой указывает на 25 ° F по сравнению с предыдущей. Таким образом, большая метка указывает на 100 ° F по сравнению с предыдущей большой. 

EGT вместе с CHT (температура головки цилиндров) является полезным индикатором того, что происходит внутри двигателя.

Просто посмотрите на это так: внутри двигателя вы смешиваете воздух с топливом. Вам нужно около пятнадцати частей кислорода на каждое топливо для «идеального» сгорания (когда все части топлива в камере сжигаются, и после сгорания не остается ни кислорода, ни топлива).
Соотношение 15: 1 называется стехиометрическим соотношением.
Когда вы летите на уровне моря и выставляете богатую смесь, соотношение ниже стехиометрического, скажем, 14: 1. Это означает, что некоторое топливо не будет сгорать. Это просто охладит цилиндры, создав тем самым определенный ЭГТ.
Когда вы летите и медленно обедняете смесь, вы увеличиваете соотношение до 15: 1. Поскольку при обеднении смеси в двигатель поступает меньше топлива, вы видите, что индикатор EGT сообщает о повышении температуры. Чем больше вы обедняете, тем выше температура.
В определенный момент температура достигает максимума. Этот пик - пик EGT, означает что вы достигли управления двигателем в соотношении 15: 1.
С этого момента EGT начнет падать, если вы продолжите обеднять смесь. Это связано с тем, что воздуха станет больше, чем топлива, несгоревший воздух охлаждает цилиндры, создавая более низкую EGT.
Теперь ROP и LOP начинают что-то значить.
ROP расшифровывается как Rich of Peak, то есть более богатая смесь, чем та, что вам нужна для полета на пике EGT.
LOP означает Lean of Peak, то есть более бедную смесь, чем та, которая вам нужна для полета на пике EGT.

Правило большого пальца

Теперь, когда мы знаем, что означают ROP и LOP, мы можем определить простое правило, чтобы избежать каких-либо проблем во время полета.
Давайте разделим нашу «работу двигателя» на три части, исходя из процента выходной мощности двигателя. Чтобы узнать, в каком проценте от максимальной непрерывной мощности (MCP) вы находитесь, настройте параметры двигателя на справочных таблицах, которые вы найдете в контрольных списках (цифровых или печатных) вашего самолета REP.
Очень высокая мощность (более 80% MCP)
В этой ситуации EGT уже сам по себе высок. Двигатель находится в состоянии «стресса», поэтому чем меньше мы обедняем, тем лучше для двигателя. Обедняем больше, чем 60LOP или обогащаем больше, чем 200ROP.
Высокая мощность (более 75% MCP)
Правило не обеднять между 180ROP и 40 LOP.
Если обогатите больше 180ROP, двигатель будет достаточно охлажден за счет топлива. Если вы идете более 40LOP, двигатель будет охлаждаться воздухом. В середине между ними вы повредите двигатель.
Следование LOP может привести к ухудшению характеристик двигателя, и к высокому быстродействию, но сэкономим много топлива.
Средняя мощность (более 70% MCP)
Обедняйте менее 25 LOP или богаче, чем 125ROP. Причины те же, что и выше. Интервал между ограничениями только что сузился, потому что внутреннее давление в двигателе ниже, чем раньше.
Средняя мощность (более 65% MCP)
Обедняйте меньше, чем пик или богаче, чем 100ROP.
Низкое энергопотребление (менее 65% MCP)
Вы свободны. Обедняете, сколько хотите.

 

 

понедельник, 8 апреля 2019 г.

Солнечная система в цифрах

Охотно допускаю, что приведенные цифры могут не совпадать ни с чем. Привел я их для сравнения. Ну например: Если поделить значения в таблице на миллион, то получится, что Солнце это шар размером 1 метр 40 см, а Земля это "шар" размером с виноградину (12 миллиметров) летит по кругу на расстоянии 150 метров. Людей на миллион делить не будем, иначе глубоко уйдем в микромир. Возникает вопрос а зачем это все сделали? Или что-то пошло не так?
Астрономическая единица равна расстоянию от Земли до Солнца: 149 597 870 700 метрам
Значения указаны в км
Название Диаметр Перигелий Афелий Вращение вокруг Солнца вокруг оси
Солнце 1 392 000 25,4 суток
Меркурий 4 879 46 001 009 69 817 445 87,97 суток 58 суток
Венера 12 104 107 476 259 108 942 109 224,7 суток 243 суток
Земля 12 742 147 098 290 152 098 232 год сутки
Марс 6 792 206 655 000 249 232 000 687 суток 24часа 37мин
Юпитер 139 822 740 573 600 816 520 800 11,87 лет 9часов 55мин
Сатурн 116 464 1 353 572 956 1 513 325 783 29,46 лет 10часов 14мин
Уран 50 724 2 748 938 461 3 004 419 704 84,02 года 17часов 14мин
Нептун 49 244 4 452 940 833 4 553 946 490 164,78 лет 16часов 7мин
Плутон 2374 4 438 120 009 7 376 670 969 248,09 лет 6,387 суток
С 2006 года Плутон за планету не признается. А вы говорите справедливость!?

суббота, 2 марта 2019 г.

Форматируемые строковые литералы в Python 3.6

2.4.3. Форматируемые строковые литералы

Новое в версии 3.6.
Форматируемые строковые литералы или f-строки это строковые литералы, перед которыми стоят буквы 'f' или 'F'. Эти строки могут содержать заменяемые поля, которые представляют из себя выражения ограниченные фигурными скобками {}. В то время как обычные строковые литералы всегда имеют постоянные значения, форматируемые строки это настоящие выражения, вычисляемые во время выполнения программы, а именно в момент активизации f-строки.
Эскейп последовательности декодируются так же как в обычных строковых литералах (за исключением случаев, когда литерал помечается как сырая строка(raw), символом r). После декодирования грамматика для содержимого строки может быть представлена так:
f_string ::= (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::=  "{" f_expression ["!" conversion] [":" format_spec] "}"
f_expression      ::=  (conditional_expression | "*" or_expr)
                         ("," conditional_expression | "," "*" or_expr)* [","]
                       | yield_expression
conversion        ::=  "s" | "r" | "a"
format_spec ::= (literal_char | NULL | replacement_field)*
literal_char ::=
Части строки вне фигурных скобок воспринимаются как литералы, за исключением двойных фигурных скобок '{{' или '}}', которые замещаются соответствующими одинарными фигурными скобками. Одиночная открывающая фигурная скобка '{' отмечает поле замены, которое начинается с питоновского выражения. После этого выражения может следовать поле преобразования, начинающееся символом восклицательный знак '!'. Может быть добавлен спецификатор форматирования, начинающийся символом двоеточие ':'. Поле замены заканчивается закрывающей фигурной скобкой '}'.
Выражения в форматируемых строковых литералах трактуется как питоновское регулярное выражение окруженное скобками, за несколькими исключениями. Не позволяется пустое выражение, и выражение типа lambda должно быть окружено явными скобками. Выражение замены может содержать разрыв строки (также как в строках внутри тройных кавычек), но не может включать комментарии. Каждое выражение вычисляется слева на право в том контексте, в котором появился форматируемый строковый литерал.
Если преобразование задано, то результат вычисления выражения перед форматированием преобразуется. Преобразование '!s' вызывает функцию str(), '!r' вызывает repr(), а '!a' вызывает ascii().
Результат затем форматируется при помощи протокола format(). Указатель форматирования передается в метод __format__() из выражения или из результата преобразования. Если указатель форматирования опущен, то передается пустая строка. Результат форматирования затем включается в финальное значение целой строки.
Указатель форматирования верхнего уровня может включать вложенные в друг друга поля замены. Эти вложенные поля могут включать свои собственные поля преобразования и указатели форматирования, но не могут включать более глубоко вложенные поля замены.
Форматируемые строковые литералы могут сцепляться, но поля замены не могут быть разделены через литералы.
Некоторые примеры форматируемых строковых литералов:
>>> name = "Fred"
>>> f"He said his name is {name!r}."
"He said his name is 'Fred'."
>>> f"He said his name is {repr(name)}."  # repr() is equivalent to !r
"He said his name is 'Fred'."
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # nested fields
'result:      12.35'
Следствием использования того же синтаксиса, что и в обычных строковых литералах является условие: символы в полях замены не должны конфликтовать с кавычками, окружающими форматируемый строковый литерал:
f"abc {a["x"]} def" # ошибка: весь строковый литерал заканчивается проеждевременно
f"abc {a['x']} def"    # решение проблемы: использовать разные кавычки
Обратная косая черта в выражениях форматирования не допускается и вызывает ошибку:
f"newline: {ord('\n')}"  # вызывет ошибку SyntaxError
Чтобы включить значение с обратной чертой, созлайте временную переменную.
>>> newline = ord('\n')
>>> f"newline: {newline}"
'newline: 10'
Форматируемые строковые литералы не могут использоваться как строки документы (docstrings), даже если они и не содержат выражений.
>>> def foo():
...     f"Not a docstring"
...
>>> foo.__doc__ is None
True
Смотрите страницу PEP 498 для ознакомления с предложением, которое добавило форматированные строковые литералы и метод str.format(), который использует связанный механизм форматирования строк.

суббота, 23 февраля 2019 г.

Сопрограммы в языке Python

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

 В языке Python на идеях сопрограмм реализованы конструкции генераторов-итераторов. Эти функции при первом обращении организуют сопрограмму, а запускают обработку командой .next(). Возврат из сопрограммы промежуточных результатов выполняется оператором yield. Когда итерация закончена, сопрограмма выполняет оператор return. Построенная подобным способом сопрограмма может выполняться в циклах языка Python.

Подробнее этот алгоритм описан в PEP 255. Далее я привожу перевод части этого документа.


Определение: Yield

Вводится новое предложение:
yield_stmt:    "yield" expression_list
Предложение yield можно использовать только внутри функций. Функция, содержащая предложение yield называется функцией генератором. Функция генератор во всех отношениях является обычной функцией, но в члене кодового объекта co_flags этой функции, установлен новый флаг CO_GENERATOR.
Когда функция генератор вызывается, актуальные аргументы как обычно связываются с именами формальных аргументов локальной функции, но код в теле этой функции не выполняется. Вместо этого возвращается объект типа генератор-итератор; это соответствует протоколу итератора, поэтому, в частности, может использоваться в циклах for естественным образом. Обратите внимание, что когда намерение ясно из контекста, безоговорочное имя «генератор» может использоваться для ссылки либо на функцию-генератор, либо на генератор-итератор.

Каждый раз, когда вызывается метод .next() генератора-итератора, начинает выполняться код в теле функции-генератора до тех пор пока не встретятся предложения yield или return, или пока не будет достигнут конеч тела процедуры.

Если встречается предложение yield, статус функции замораживается и значение expression_list возвращается вызвавшему .next(). Под "замораживанием" мы подразумеваем что сохраняется все локальное состояние, включая указатели на локальные переменные, указатели на инструкции, и внутренний стэк: сохраняется достаточно информации для того чтобы при следующем вызове .next(), функция могла бы действовать точно так же, как если бы оператор yield был просто еще одним внешним вызовом..
Ограничение: Предложение yield нельзя использовать в выражении try из конструкции try/finally. Сложность состоит в том, что нет никакой гарантии, что генератор когда-либо будет возобновлен, следовательно, нет никакой гарантии, что блок finally когда-либо будет выполнен.
Ограничение: генератор не может быть возобновлен во время его активной работы:
>>> def g():
...     i = me.next()
...     yield i
>>> me = g()
>>> me.next()
Traceback (most recent call last):
 ...
 File "", line 2, in g
ValueError: generator already executing

Определение: Return

Функция-генератор может содержать предложения возврата в виде:
return
Обратите внимание на то, что список-выражений(expression_list) нельзя указывать в предложениях return в теле генераторов (хотя, конечно, их можно указывать в теле функций не-генераторов, которые находятся внутри функций-генераторов).
Когда встречается предложение return, управление происходит как и в любой другой функции. Сначала выполняются соответствующие завершающие выражения (finally clauses) (если они есть). Затем инициируется исклбчение StopIteration, сигнализируя что итератор закончен. Исключение StopIteration инициализируется и в случае если генератор закончил свою работу без явного предложения return.
Обратите внимание, что return не всегда эквивалентен инициализации StopIteration: разница заключается в том, как обрабатываются включающие конструкции try/except. Например,:
>>> def f1():
...     try:
...         return
...     except:
...        yield 1
>>> print list(f1())
[]
потому, что здесь как в любой функции return это просто возврат, но:
>>> def f2():
...     try:
...         raise StopIteration
...     except:
...         yield 42
>>> print list(f2())
[42]
А здесь исключение StopIteration как любое исключение заставляет выполниться выражение в правиле except.

понедельник, 21 января 2019 г.

Пространство имен (namespace) в языке Tcl

Что такое Пространство имен?

Пространство имен (namespace) это коллекция команд и переменных. Оно (Пространство имен) включает в себя те команды и переменные, о которых должна быть уверенность, что они не пересекутся с командами и переменными из других пространств имен. Язык Tcl имеет всегда хотя бы одно такое пространство имен, к которому мы ссылаться как глобальному пространству имен (global namespace). Глобальное пространство имен содержит все глобальные переменные и команды. Команда namespace eval позволяет вам создать новое пространство имен. Например,

namespace eval Counter {
namespace export bump
variable num 0

proc bump {} {
variable num
incr num
}
}
создает новое пространство имен, содержащее переменную num и процедуру bump. Команды и переменные в этом пространстве имен отделены от других команд и переменных в этой программе. Если существует команда с именем bump в глобальном пространстве имен, она отличается от команды bump в пространстве имен Counter.

Переменные пространства имен напоминают глобальные переменные в Tcl. Они существуют вне процедур в пространстве имен, а получить доступ к ним из процедур можно через команду variable, как показано в предыдущем примере.

Существуют пространства имен динамически. Вы можете добавлять и удалять команды и переменные в любое время, так что вы можете строить контекст пространства имен в течение времени существования скрипта используя серию команд namespace eval. Например, следующая серия команд имеет тот же эффект, что и предыдущие команды:

namespace eval Counter {
variable num 0

proc bump {} {
variable num
return [incr num]
}
}
namespace eval Counter {
proc test {args} {
return $args
}
}
namespace eval Counter {
rename test ""
}

Обратите внимание, что процедура test первоначально добавлена к пространству имен Counter, а потом удалена командой rename.

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

Уточненные имена

Каждое пространство имен имеет имя такое как history или ::safe::interp. Так как пространства имен могут быть вложенными друг в друга, уточненные имена используются для ссылки к командам, переменным и пространствам имен входящим в данное пространство имен. Уточненные имена похожи на иерархические цепочки имен для указания файлов в системе Unix или виджетов в Tk, за исключением того, что символы :: используются как разделители вместо / или .. Самое верхнее или глобальное пространство имен имеет имя “” (т.е., пустая строка), хотя :: это синоним. Например, имя ::safe::interp::create ссылается к команде созданной в пространстве имен с именем interp которое является дочерним от пространства имен ::safe, которое в свою очередь является дочерним от глобального пространства имен ::.

Если вы хотите получить доступ к командам и переменным из другого пространства имен, вы должны использовать уточняющий синтаксис. Имена должны быть уточнены (qualified) именем пространства имен, которое содержит их. Из глобального пространства имен мы можем получить доступ к процедурам пространства имен Counter следующим образом:

Counter::bump 5
Counter::Reset

Мы можем получить доступ к текущему счету примерно так:

puts "count = $Counter::num"

Когда какое-нибудь пространство имен содержит другое пространство имен, вам может потребоваться более чем одно уточняющее имя для доступа к его элементам. Если вы имеете пространство имен с именем Foo, а оно включает в себя пространство имен Counter, вы можете вызвать процедуру bump, находясь в глобальной пространстве имен, следующим образом:

Foo::Counter::bump 3

Также вы можете использовать уточненные имена когда создаете и переименовываете команды. Например, вы можете добавить процедуру к пространству имен с именем Foo следующим образом:

proc Foo::Test {args} {return $args}

А вот так вы можете переместить эту же процедуру в другое пространство имен:

rename Foo::Test Bar::Test

Еще несколько слов об уточненных именах. Все пространства имен должны иметь не пустое имя кроме глобального пространства имен. Символ :: не допускается ни в команде, ни в переменных, ни в пространстве имен, за исключением использования символа как разделитель имен пространств имен. Лишние двоеточия в любом месте разделителя части имени пространства имен игнорируются; т. е. Два или более двоеточия рассматриваются как разделитель. Символ :: в конце уточненного имени переменной или команды ссылается к переменной или команде с именем {}. Кроме того, символы :: в конце уточненного имени пространства имен игнорируется.

пятница, 20 июля 2018 г.

Автоувеличение в SQLite

Автоувеличение в SQLite

Выводы

  1. Ключевое слово AUTOINCREMENT вызывает дополнительный расход ресурсов CPU, памяти, дискового пространства и операций ввода вывода а мы этого должны избегать по возможности. Использовать этот параметр обычно не обязательно.
  2. В SQLite, колонка с типом INTEGER PRIMARY KEY это синонимом для ROWID (за исключением таблиц типа WITHOUT ROWID) которые всегда являются целыми 64-bit числами со знаком.
  3. В предложении INSERT, если ROWID или колонка INTEGER PRIMARY KEY явно не задано значение, тогда это поле будет автоматически заполнено целым числом до этого неиспользованным, обычно это число большее, чем любое использованное до этого. Это действует вне зависимости от того используете вы AUTOINCREMENT или нет.
  4. Если ключевое слово AUTOINCREMENT появляется после INTEGER PRIMARY KEY, то это меняет алгоритм автоматического выбора значения ROWID в части повторного использования ROWID за весь период существования базы данных. Другими словами, цель использования AUTOINCREMENT состоит в том чтобы предотвратить повторное использования ROWIDs из уже удаленных строк.

Описание

В SQLite, строки таблицы обычно имеют целое с знаком длиной 64-bit с именем ROWID , которое уникально среди всех строк в этой таблице. (WITHOUT ROWID таблицы это исключение.) 
 
Вы можете получить доступ к ROWID в таблице SQLite используя один из следующих специальных имен колонок ROWID, _ROWID_ или OID. Если вы присвоили эти имена своим колонкам, то доступ к внутренним ROWID теряется.
Если таблица содержит колонки типа INTEGER PRIMARY KEY, тогда эта колонка становится синонимом (alias) для ROWID. Вы можете теперь получить доступ к ROWID используя любое из четырех различных имен — три оригинальных имени описанных выше или имя, которое вы присвоили колонки типа INTEGER PRIMARY KEY. Все эти имена являются синонимами для друг друга и одинаково хорошо в любых контекстах.
Когда в таблицу SQLite вставляется новая строка, ROWID может быть задана как часть предложения INSERT или может быть назначена автоматически движком базы данных. Чтобы задать ROWID в ручную, нужно только включить его в список вставляемых значений. Например:
CREATE TABLE test1(a INT, b TEXT);
INSERT INTO test1(rowid, a, b) VALUES(123, 5, 'hello');
Если при вставке, ROWID не задан, или если заданный ROWID имеет значение NULL, тогда соответствующий ROWID создается автоматически. Обычный алгоритм состоит в том, чтобы ROWID для вновь созданной строки должен являться большим чем ROWID в строках таблицы, введенных до этого. Если таблица первоначально пуста, то в качестве ROWID используется число 1. Если наибольший ROWID равен наибольшему целому числу (9223372036854775807), тогда движок базы данных начинает перебор положительных кандидатов ROWID в случайном порядке до тех пор пока не найдет в таблице не использованное ранее значение. Если такого ROWID нет, то операция вставки заканчивается не удачей с ошибкой SQLITE_FULL. Если явно заданное отрицательное значение ROWID не может быть вставлено, тогда автоматически генерируется ROWID, которое всегда больше нуля.

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

Ключевое слово AUTOINCREMENT

Если колонка имеет тип INTEGER PRIMARY KEY AUTOINCREMENT, тогда для нее используется немного отличающийся алгоритм выбора ROWID. Значение ROWID, выбираемое для новой строки, должно быть хотя бы на единицу больше наибольшего значения ROWID уже записанного в таблице. Если в таблице не было данных, значение ROWID принимается равным 1. Если таблица уже содержала раньше запись с наиболее возможным ROWID, тогда вставить новую запись не удастся, произойдет ошибка с кодом SQLITE_FULL error. Рассматриваются только значения ROWID тех записей, для которых выполнена операция коммит. Значения ROWID записей, которые отменены (rolled back) могут снова использоваться.

SQLite отслеживает самый большой ROWID, который когда-либо проводила таблица, используя внутреннюю таблицу с именем «sqlite_sequence». Таблица sqlite_sequence создается и инициализируется автоматически, когда создается нормальная таблица, содержащая столбец AUTOINCREMENT. Содержание таблицы типа sqlite_sequence можно изменять, используя обычные UPDATE, INSERT или DELETE предложения. Но внесение изменений в такую таблицу, вероятно, нарушит алгоритм генерации ключа принятый для AUTOINCREMENT. Будьте уверены, в том что произойдет, перед выполнением таких изменений.

Поведение, выполняемое ключевым словом AUTOINCREMENT, существенно отличается от поведения по умолчанию. С AUTOINCREMENT в строках с автоматически выбранными ROWID гарантируется наличие ROWID, которые никогда не использовались ранее одной таблицей в той же базе данных. И автоматически генерируемые ROWID гарантированно будут монотонно увеличиваться. Это важные свойства в некоторых приложениях. Но если вашему приложению не нужны эти свойства, вы, вероятно, должны оставаться с поведением по умолчанию, так как использование AUTOINCREMENT требует дополнительной работы, которая должна выполняться по мере добавления каждой строки и, следовательно, заставляет INSERT работать немного медленнее.

Обратите внимание, что «монотонное увеличение» не означает, что ROWID всегда увеличивается ровно на единицу. Единица - обычное приращение. Однако, если вставка завершилась неудачей из-за (например) ограничения уникальности, ROWID неудачной попытки вставки не может быть повторно использован для последующих вставок, что приведет к пробелам в последовательности ROWID. AUTOINCREMENT гарантирует, что автоматически выбранные ROWID будут увеличиваться, но не обязательно, что они будут последовательными.


Так как ключевое слово AUTOINCREMENT изменяет поведение алгоритм поиска ROWID, AUTOINCREMENT не разрешается в таблицах типа WITHOUT ROWID или на табличных колонках с типом отличным от INTEGER PRIMARY KEY. Любая попытка использовать AUTOINCREMENT на таблице типа WITHOUT ROWID или на колонках отличных от INTEGER PRIMARY KEY приведет к возникновению ошибки.

X-Plane 11, 12 - любитель, Фото любитель со стажем

Постоянные читатели

Архив блога