102

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!

Colonel Thirty Two
  • 23,953
  • 8
  • 45
  • 85
CppLearner
  • 16,273
  • 32
  • 108
  • 163
  • you ask for an ALTER COLUMN syntax, but you don't say what you want to do. That makes me think that this is too broad. ALTER COLUMN could do a lot, are you looking to drop the not null constraint like in the pg example? – Evan Carroll Sep 16 '18 at 11:04
  • if your used intellj db tools, when you change the colum it would generate the commands for your sqlite. – foolcage Aug 14 '19 at 01:34

5 Answers5

135

There's no ALTER COLUMN in sqlite.

I believe your only option is to:

  • Rename the table to a temporary name
  • Create a new table without the NOT NULL constraint
  • Copy the content of the old table to the new one
  • Remove the old table

This other Stackoverflow answer explains the process in details

Community
  • 1
  • 1
Alex Jasmin
  • 39,094
  • 7
  • 77
  • 67
  • This answer encounters additional challenges when there are foreign key constraints in other tables that rely on the table being modified. – Eric Walker May 29 '23 at 16:56
68

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.

ALTER TABLE SYNTAX

Matthias Neubert
  • 275
  • 1
  • 5
  • 24
Noah
  • 15,080
  • 13
  • 104
  • 148
  • 7
    This method worked for me, although to avoid situations in which the columns might be in a different order (i.e. from a previous ADD COLUMN command), I used: UPDATE SQLITE_MASTER SET SQL = replace(SQL, '[MyColumn] integer NOT NULL', '[MyColumn] integer NULL') WHERE NAME = 'MyTable'. Also, be careful not to run this as part of a transaction - it may prevent some of the earlier transaction commands from running. – Ross Aug 16 '13 at 14:58
34

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.

  1. BEGIN TRANSACTION;
  2. CREATE TEMPORARY TABLE t1_backup(a,b);
  3. INSERT INTO t1_backup SELECT a,b FROM t1;
  4. DROP TABLE t1;
  5. CREATE TABLE t1(a,b);
  6. INSERT INTO t1 SELECT a,b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. COMMIT

For more detail you can refer the link.

Rajesh
  • 764
  • 8
  • 16
4
  1. CREATE TABLE temp_Table(x,y[,etc]);

  2. INSERT INTO temp_Table SELECT * FROM Table;

  3. DROP TABLE Table;

  4. ALTER TABLE temp_Table RENAME TO Table;

Thanks for helping me to find a definitive method!

1

ALTER COLUMN does not exist in SQLite.

Only Supported alter operations:

  • Alter Table Name
  • Alter Table Column Name
  • Add New Column
  • Drop Column

Alex Jasmin's answer shows possible way

Reference:

tanmoy
  • 1,276
  • 1
  • 10
  • 28