SQLite的“ MATCH NONE”是什么意思?

时间:2018-12-01 13:36:24

标签: sqlite

以下CREATE TABLE语句已从DB Browser导出用于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 :(得分:0)

  

MATCH NONE做什么?

简而言之,当在外键中作为约束编码时,SQLite中什么也没有。

在外键中,它对外键处理没有影响,它会被忽略,但仍会被解析,并希望后面跟随一个关键字。

它基本上支持 MATCH 关键字的编码,并且具有 SIMPLE PARTIAL Full (以及显然)。但是,第二个关键字不限于关键字 SIMPLE PARTIAL FULL

  • 我相信任何单词(不确定是否存在限制,但必须测试 RUMPLESTILTSKIN 作为第二个单词的解析)关键字的2字格式。

  • 注释数字将导致语法错误。

基本上,它可以像其他SQLite一样使用其他DBM中的SQL。

如果DM使用了

MATCH NONE可能会被编码为在SQL中强制执行错误,以强调需要考虑SQLite外键处理可能不同或需要考虑这一事实。

SQLite Foreign Key Support - 6. Limits and Unsupported Features

MATCH在外键之外在SQL中还有其他用途:-

MATCH 是FTS3 / 4(全文搜索)运算符,类似于LIKE,但是可以找到单词,例如MATCH('Fred')将找到Fred was here,但找不到Frederick was here

SQLite FTS3 and FTS4 Extensions


MATCH还是表达式中的运算符:-

  

MATCH运算符是match()的特殊语法   应用程序定义的功能。默认的match()函数   实现会引发异常,并且对于   任何东西。但是扩展可以覆盖更多的match()函数   有用的逻辑。

SQL As Understood By SQLite - expression - The LIKE, GLOB, REGEXP, and MATCH operators


  

在CREATE中明确定义它是否合适?   TABLE语句?

可能是,因为它随后通过语法错误(可能)突出了SQLite外键处理可能/确实有所不同的区别。

答案 1 :(得分:0)

尽管共享关键字,但它与MATCH子句中的WHERE表达式无关。

使用外键上的the documentation

  

根据SQL92,可以将MATCH子句附加到复合外键定义,以修改处理子键中出现的NULL值的方式。如果指定了“ MATCH SIMPLE”,则如果一个或多个子键值为NULL,则不需要子键对应于父表的任何行。如果指定了“ MATCH FULL”,则如果任何子键值是NULL,则父表中不需要相应的行,但是所有子键值都必须为NULL。最后,如果将外键约束声明为“ MATCH PARTIAL”,并且子键值之一为NULL,则父表中必须至少存在一行,其非NULL子键值与父键值匹配。

     

SQLite解析MATCH子句(即,如果指定一个子句,则不报告语法错误),但不强制执行它们。在SQLite中处理所有外键约束的方式就像指定了MATCH SIMPLE一样。

我不知道MATCH NONE是什么意思,但是和其他情况一样,这是另一个禁忌。

类似这样的东西,非sqlite列类型以及列名周围的所有反引号使我认为此表最初是与其他RDBMS一起使用的,有人只是将定义复制并粘贴到sqlite中,即对这样的事情非常宽容,实际上接受了。

答案 2 :(得分:0)

“ MATCH NONE”表示如果子表中的任何键列为NULL,则不需要父表中的相应行。

引用https://www3.sqlite.org/cgi/src/artifact/cf68fddd4643bbe3