How do I alter column in sqlite?
This is in Postgresql
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
I believe there is no ALTER COLUMN in sqlite at all, only ALTER TABLE is supported.
Any idea? Thanks!
How do I alter column in sqlite?
This is in Postgresql
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
I believe there is no ALTER COLUMN in sqlite at all, only ALTER TABLE is supported.
Any idea? Thanks!
There's no ALTER COLUMN in sqlite.
I believe your only option is to:
This other Stackoverflow answer explains the process in details
While it is true that the is no ALTER COLUMN, if you only want to rename the column, drop the NOT NULL constraint, or change the data type, you can use the following set of dangerous commands:
PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;
You will need to either close and reopen your connection or vacuum the database to reload the changes into the schema.
For example:
Y:\> **sqlite3 booktest**
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> **create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT
NULL);**
sqlite> **insert into BOOKS VALUES ("NULLTEST",null);**
Error: BOOKS.publication_date may not be NULL
sqlite> **PRAGMA writable_schema = 1;**
sqlite> **UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT
NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';**
sqlite> **PRAGMA writable_schema = 0;**
sqlite> **.q**
Y:\> **sqlite3 booktest**
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> **insert into BOOKS VALUES ("NULLTEST",null);**
sqlite> **.q**
REFERENCES FOLLOW:
pragma writable_schema
When this pragma is on, the SQLITE_MASTER tables in which database can be changed using ordinary UPDATE, INSERT, and DELETE statements. Warning: misuse of this pragma can easily result in a corrupt database file.
[alter table](From http://www.sqlite.org/lang_altertable.html)
SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.

SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table. But you can alter table column datatype or other property by the following steps.
For more detail you can refer the link.
I suggest you use DB Browser for SQLite. You can easily change constraints with it. For example in DB Browser for SQLite you can go to Database Structure -> Right Click your table -> Click Modify Table -> and uncheck the NN (Not Null) column then click ok.
ALTER COLUMN does not exist in SQLite.
Only Supported alter operations:
Alex Jasmin's answer shows possible way
Reference:
If all you're doing is changing the type of the column, then you often won't need to alter the column because SQLite is dynamically typed and you can put data other than the type of the column; column types are more of a suggestion than anything else. There are some quirks that come with the column's type (coercion rules) that you may need to work around, but the database will happily accept data of the "wrong" type.
In all practicality, you're not generally going to be changing a column's type all that drastically (in typical databases, you would often only be changing the size of the type- for instance VARCHAR(16) -> VARCHAR(32) - not the category of type), so the only thing that is going to be a struggle to work around is NOT NULL constraints- in which case you can use one of the other helpful answers here in order to achieve what you're looking for.
Trying to fix the answer marked as correct in this question:
This answer did not work for me because renaming the table directly instead of creating a new table gave me problems related to foreign key constraints, the next solution worked the best for me:
First deactivate foreign keys temporally to avoid problems while handling the structure change PRAGMA foreign_keys = OFF;.
Then create a new table with a different name from the table that you want to alter and with the column change that you want to make CREATE TABLE new_books_book (...);.
Then move all the data from the old table to the new one, in my case INSERT INTO new_books_book (a,b,c) SELECT a, b, c FROM books_book; kinda operation worked for me, you may need to adapt the data to fit the new table structure.
Then delete the old table DROP TABLE books_book;.
Then rename the new table to the name of the old one ALTER TABLE new_books_book RENAME TO books_book;.
Finally, enable foreign keys again to make everything work as usual PRAGMA foreign_keys = ON;.
Reference: