This is a documented feature. The documentation is at <https://www.sqlite.org/quirks.html#keywords_can_often_be_used_as_identifiers>. If you will run: ~~~~~ PRAGMA table_info=foo; ~~~~~ You'll find that you have created a table with a single column named "`integer`" with no datatype specified and which is the PRIMARY KEY. The table is the same as: ~~~~~ CREATE TABLE foo(bar PRIMARY KEY); ~~~~~ Except that in your table the column is named "`integer`" instead of "`bar`". SQLite has long had the ability to use keywords as identifiers. This is because SQL has many keywords that can potentially collide with identifier names, and as we add new keywords when new features are added, the new keywords do not break legacy schemas. The ability to use keywords as identifiers promotes extreme backwards compatibility.