如何在SQLite 3.31.1中启用严格模式?

7cjasjjr  于 2022-11-30  发布在  SQLite
关注(0)|答案(2)|浏览(229)

我正在尝试根据this pagerequire a datatype on every table column and enforce those types.启用严格模式。

$ sqlite3 ./a_new_database.sqlite
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> PRAGMA strict=ON;
sqlite> CREATE TABLE yay ( col1 TEXT, col2 INT );
sqlite> INSERT INTO yay ( col1, col2 ) VALUES ("this works", "this is the wrong type");
sqlite> SELECT * from yay;
this works|this is the wrong type
sqlite> 
$

我不仅可以INSERT错误的数据类型,我也可以SELECT它。
我试过PRAGMA strict=ON;PRAGMA strict=1;。都不起作用。我想我没有正确地启用严格模式。
如何正确启用严格模式?

fdbelqdn

fdbelqdn1#

根据documentation,您将STRICT添加到表声明的末尾:

$ sqlite3
SQLite version 3.37.0 2021-11-27 14:13:22
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> CREATE TABLE yay ( col1 TEXT, col2 INT ) STRICT;
sqlite> INSERT INTO yay ( col1, col2 ) VALUES ("this works", "this is the wrong type");
Error: stepping, cannot store TEXT value in INT column yay.col2 (19)

需要注意的是,这是SQLite 3.37.0版的新功能。在任何以前版本的SQLite上,表创建都将失败。并且任何以前版本都将无法打开使用此标志创建的数据库文件,并显示“malformed database schema”错误,除非在打开数据库之前指定PRAGMA writable_schema=ON pragma。
您可以在旧版本的SQLite上使用类似的CHECK约束概念:

SQLite version 3.31.0 2020-01-22 18:38:59
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> CREATE TABLE yay ( col1 TEXT CHECK (typeof(Col1) = 'text'), col2 INT CHECK (typeof(Col2) = 'integer'));
sqlite> INSERT INTO yay ( col1, col2 ) VALUES ("this works", "this is the wrong type");
Error: CHECK constraint failed: yay
bq3bfh9z

bq3bfh9z2#

根据文档,STRICT表仅在3.37或更高版本的sqlite3中受支持

相关问题