Что означает SQLite MATCH NONE? - PullRequest
0 голосов
/ 01 декабря 2018

Следующий оператор CREATE TABLE был экспортирован из браузера БД для SQLite.

Что делает MATCH NONE?(находится в последней строке в выражении CONSTRAINT)

Считается ли целесообразным явно определить его в выражении CREATE TABLE?

CREATE TABLE IF NOT EXISTS `Reports` (
    `ID`    integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    `ParameterTypeID`   integer,
    `ReportTypeID`  integer NOT NULL,
    `DurationToSpan`    integer NOT NULL,--# of Days or # of Week
    `SpanDurationType`  char ( 4 ) NOT NULL,--Day,Week
    `Name`  nvarchar ( 250 ) NOT NULL,
    `Description`   nvarchar ( 500 ) DEFAULT NULL,
    `DateCreated`   datetime DEFAULT current_timestamp,
    `DateModified`  datetime DEFAULT current_timestamp,
    `CreatedBy` nvarchar ( 100 ) DEFAULT 'Admin',
    `IsActive`  boolean DEFAULT 1,
    `SortBy`    char ( 4 ) NOT NULL, --Amit, confirm NOT NULL is okay with your code
    CONSTRAINT `FK_Reports_0_0` FOREIGN KEY(`ReportTypeID`) REFERENCES `ReportsType`(`ID`) MATCH NONE ON UPDATE NO ACTION ON DELETE NO ACTION
);

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Он не связан с выражением MATCH в предложении WHERE, несмотря на совместное использование ключевого слова.

С документация по внешним ключам:

Согласно SQL92, предложение MATCH может быть присоединено к определению составного внешнего ключа, чтобы изменить способ обработки значений NULL в дочерних ключах.Если указано «MATCH SIMPLE», то дочерний ключ не обязан соответствовать какой-либо строке родительской таблицы, если одно или несколько значений дочернего ключа имеют значение NULL.Если указано «MATCH FULL», то если любое из значений дочернего ключа равно NULL, соответствующая строка в родительской таблице не требуется, но все значения дочернего ключа должны быть NULL.Наконец, если ограничение внешнего ключа объявлено как «MATCH PARTIAL» и одно из значений дочернего ключа равно NULL, должна существовать хотя бы одна строка в родительской таблице, для которой значения не-NULL дочерних ключей соответствуют значениям родительского ключа.

SQLite анализирует предложения MATCH (т.е. не сообщает о синтаксической ошибке, если вы ее указали), но не применяет их.Все ограничения внешнего ключа в SQLite обрабатываются так, как если бы было указано MATCH SIMPLE.

Я не знаю, что должно означать MATCH NONE, но это еще один запрет, как в других случаях.

В общем, типы столбцов, не являющиеся sqlite, и все обратные пометки вокруг имен столбцов заставляют меня думать, что эта таблица изначально использовалась с другой RDBMS, и кто-то просто скопировал и вставил определение в sqlite, который, будучи очень снисходительно относится к таким вещам, на самом деле принял это.

0 голосов
/ 02 декабря 2018

«MATCH NONE» означает, что если какой-либо из ключевых столбцов в дочерней таблице имеет значение NULL, то для соответствующей строки в родительской таблице не требуется.

Ссылка https://www3.sqlite.org/cgi/src/artifact/cf68fddd4643bbe3

0 голосов
/ 01 декабря 2018

Что делает MATCH NONE?

Короче говоря, ничего внутри SQLite, когда кодируется как ограничение во внешнем ключе.

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

Он в основном поддерживает кодирование ключевого слова MATCH иэто опции SIMPLE , PARTIAL и FULL (и, очевидно,).Однако второе ключевое слово не ограничивается ключевыми словами SIMPLE , PARTIAL и FULL .

  • Я считаю, что любое слово (неуверенность в ограничениях, если таковые имеются, но в качестве теста RUMPLESTILTSKIN как второе слово было проанализировано) словотребуется, чтобы соответствовать 2-словному формату ключевого слова (sic).

  • Обратите внимание, что числовые значения приведут к синтаксической ошибке.

В основном обслуживает SQL из других СУБД, как это часто делает SQLite.

MATCH NONE можно было бы закодировать, чтобы вызвать ошибку в SQL, если она используется DM, чтобы подчеркнуть необходимость учитывать тот факт, что обработка внешнего ключа SQLite может отличаться или должна учитываться.

Поддержка внешнего ключа SQLite - 6. Ограничения и неподдерживаемые функции

MATCH имеет другие применения в SQL вне внешнего ключа: -

MATCH - это оператор FTS3 / 4 (полнотекстовый поиск), похожий на LIKE, но находит слова, например, MATCH ('Fred') найдет Fred was here, но не Frederick was here.

SQLite FTS3 и FTS4 Extensions


MATCH также является оператором в выражении согласно: -

Оператор MATCH является специальным синтаксисом для match ()определяемая приложением функция.Реализация функции match () по умолчанию вызывает исключение и ни к чему не приводит.Но расширения могут переопределять функцию match () с помощью более полезной логики.

SQL как понял SQLite - выражение - операторы LIKE, GLOB, REGEXP и MATCH


Считается ли уместным явно определить его в операторе CREATE TABLE?

Вероятно, да, поскольку это затем подчеркивает разницу посредством синтаксической ошибки (возможно,), что обработка внешнего ключа SQLite может отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...