以下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
);
答案 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,则不需要父表中的相应行。