以下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
);
最佳答案
尽管共享关键字,但它与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中,因此对此类事情非常宽大,实际接受了。
关于sqlite - SQLite的MATCH NONE是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53571320/