Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLite3 serial type wasn't incremented

Tags:

python

sqlite

I was creating a database by using SQLite3. and my python version is 2.7.5.

Before creating a database I simply created example database and tested it whether it will function well or not. and It failed that the id wasn't incremented even I declared it as a serial type.

I created simple database:

import sqlite3
con = sqlite3.connect('sample.db')
cur = con.cursor()
cur.execute("""CREATE TABLE sample(id serial,test real)""")
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(3,))
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(6,))
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(8,))
con.commit()

Then I fetched all data:

data = cur.execute("""SELECT * from sample""")
t = data.fetchall()

In [33]: t
Out[33]: [(None, 3.0), (None, 6.0), (None, 8.0)]

I expected this:Out[33]: [(1, 3.0), (2, 6.0), (3, 8.0)] However, As you can see, all of the id element was None

How can I solve this problem ? I know I can do by just incrementing a variable and Insert it. like this:

id += 1
cur.execute("""CREATE TABLE sample(id serial,test real)""")
id += 1
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(3,))
id += 1
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(6,))

However, isn't this awful ? I don't want to do it. I'd like to make my code clear and smart.

like image 917
SamuraiT Avatar asked Nov 01 '13 11:11

SamuraiT


People also ask

How to AUTO increment in SQLite?

SQLite AUTOINCREMENT is a keyword used for auto incrementing a value of a field in the table. We can auto increment a field value by using AUTOINCREMENT keyword when creating a table with specific column name to auto increment. The keyword AUTOINCREMENT can be used with INTEGER field only.

How to use ROWID in SQLite?

The rowid of a rowid table can be accessed (or changed) by reading or writing to any of the "rowid" or "oid" or "_rowid_" columns. Except, if there is a declared columns in the table that use those special names, then those names refer to the declared columns, not to the underlying rowid.

What is the SQLite_ sequence table?

The sqlite_sequence table is created and initialized automatically whenever a normal table that contains an AUTOINCREMENT column is created. The content of the sqlite_sequence table can be modified using ordinary UPDATE, INSERT, and DELETE statements.

When you insert a new row into a SQLite database it automatically generates a value for?

If you don't specify the rowid value or you use a NULL value when you insert a new row, SQLite automatically assigns the next sequential integer, which is one larger than the largest rowid in the table. The rowid value starts at 1.


2 Answers

There is no serial data type in SQLite. The correct way to create the table is with AUTOINCREMENT in SQLite:

CREATE TABLE sample ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
                      test REAL);
like image 102
Alexander Zhukov Avatar answered Sep 29 '22 14:09

Alexander Zhukov


You'd need to mark a column as INTEGER PRIMARY KEY or INTEGER PRIMARY KEY AUTOINCREMENT to get auto-incrementation behaviour.

The difference between those two types is subtle; the latter form will never reuse IDs. See the ROWID and the INTEGER PRIMARY KEY documentation.

like image 36
Martijn Pieters Avatar answered Sep 29 '22 16:09

Martijn Pieters