在Sqlite

时间:2017-05-23 21:08:43

标签: sqlite

我正在尝试使用blob类型列(内容)在SQLite中创建一个表:

create table [Files]
(
    Id int identity not null
        constraint PK_File_Id primary key,
    MimeType nvarchar (400) not null,
    Content varbinary (max) null
       constraint DF_File_Content default (0x),
);

但是以下内容未被接受:

    Content varbinary (max) null
       constraint DF_File_Content default (0x),

为什么?

2 个答案:

答案 0 :(得分:0)

"最大"是标准SQLite3函数的名称,因此不能作为类型名称的一部分使用。

答案 1 :(得分:0)

请参阅CREATE TABLE statementdata types的语法参考。 type name可以在括号中包含数字(会被忽略),但不能包含“MAX”这个词。

您似乎正在尝试使用MS SQL Server语法,并且代码中存在多个错误:

  • 如上所述,(max)不被接受为类型名称的一部分。由于默认情况下值长度不受约束,因此只需省略它即可。
  • varbinary给出了“数字亲和力”列。虽然这样的列可以存储blob,但您可能希望将其声明为blob
  • 0x不是有效的blob文字。编写空blob的正确方法是x''
  • identity被称为autoincrement。并且为了使用它,类型名称必须是integer而不是intnot null是多余的:如果您尝试在此列中插入空值,则会获得自动递增的ROWID。
    • 注意:如果您只是需要Id在任何给定时间拥有唯一值,并且不关心先前删除的值是否被重复使用,那么您可以简单地将列声明为integer primary key,插入null将使用未使用的整数填充该列。 autoincrement关键字阻止在数据库的生命周期内重用ROWID,更接近地匹配MS SQL的identity关键字的语义。请参阅上面链接中的讨论。
  • 虽然声明列约束的名称在语法上是合法的,但它没有必要。

试试这个:

create table [Files]
(
    Id integer primary key autoincrement,
    MimeType nvarchar (400) not null,
    Content blob null default (x'')
);

请注意,这不会对MimeType列强制实施长度限制。如果需要,请添加约束check (length(MimeType) <= 400)