如何使主键自动增量如0001,0002,0003而不是1,2,3?

时间:2017-12-13 21:44:11

标签: python database sqlite primary-key

据我所知,主键自动增加插入的每个记录的主键,但是当我使用选项1插入数据时,然后使用选项2显示数据,它将PK显示为1,2,3 ...等。但是,我希望它将PK存储为4位数,EG 0001,0002,0003而不是1,2,3。有没有办法做到这一点? 请注意:这是示例简化代码。

import sqlite3

connection = sqlite3.connect('database.db')
cursor = connection.cursor()
create_table = '''
CREATE TABLE IF NOT EXISTS employee (
staff_ID INTEGER PRIMARY KEY NOT NULL,
fname VARCHAR(20) NOT NULL,
lname VARCHAR(30) NOT NULL,
gender VARCHAR(20) NOT NULL);'''
cursor.execute(create_table)

print('press 1 to add new user')
print('press 2 to show all users')
option = input('1 or 2: ')

if option == '1':
    #userid = input('User ID: ')
    first_name = input('First name : ')
    surname = input('Surname: ')
    gender = input('Gender: ')

    add_staff = '''INSERT INTO employee (fname, lname, gender)
        VALUES (?, ?, ?, ?);'''
    cursor.execute(add_staff, (first_name, surname, gender))

elif option == '2':
    cursor.execute('SELECT * FROM employee')
    print('fetchall:')
    result = cursor.fetchall()
    for r in result:
    print(r)
    cursor.execute('SELECT * FROM employee')    

connection.commit()

connection.close()

另外,如何确保输入名字和姓氏时,它们只是文本值?我尝试在CREATE部分使用'text'...任何ide

3 个答案:

答案 0 :(得分:2)

您可以使用zfill方法。

key=1
str(key).zfill(4)
out[1]: '0001'

key=10
str(key).zfill(4)
out[1]: '0010'

答案 1 :(得分:0)

integers只是数字。您无法控制它们的存储方式。但是,在查询表时,您可以用零填充它们:

SELECT TO_CHAR(staff_id, 'fm0000'), fname, lname, gender
FROM   employee

答案 2 :(得分:0)

  

另外,如何确定名字和姓氏的名称   输入,它们只是文字值?我尝试在CREATE中使用'text'   部分...任何想法

除了rowid之外,任何列都可以包含任何类型的值作为以下存储类之一: -

  • 整数(最多8个字节,但最低要求)
  • Real为8字节IEEE浮点数
  • 根据数据库编码的文本
  • BLOB(字节数组)

但是,如何确定存储类是根据值本身和列的声明类型/ affinifty来确定的。

VARCHAR(30)与VARCHAR(SOMESTUPIDAMOUNT)和CHARISMA没有区别,因为发生了CHAR(并且没有出现INT),因此应用了列亲和性的第二个规则,因此列的亲和性为TEXT

  • 规则2

  •   

    如果声明的列类型包含任何字符串“CHAR”,   “CLOB”或“TEXT”然后该列具有TEXT亲和力。请注意   type VARCHAR包含字符串“CHAR”,因此分配了TEXT   亲和力。

More here about SQLite 3 Datatypes - See 3.1 Determination of Column Affinity for the rules

因此对于VARCHAR列,列亲和性是TEXT,因此它取决于具有TEXT亲和力的列的值和规则(3.类型亲和力): -

  

具有TEXT亲缘关系的列使用存储类存储所有数据   NULL,TEXT或BLOB。如果将数值数据插入到列中   TEXT亲缘关系在存储之前将其转换为文本形式。

所以你真的不需要任何东西。

但是,同样重要的是,您将如何通过get????方法之一检索数据。简而言之,如果您存储1并使用getInt方法,您将获得1的整数。如果您存储 something 并使用getInt方法,则会获得0。使用getString,您将获得1 something

There's a little more along with examples here