在sqlite3中创建一个表时指定一个列会自动使它不同吗?

dauxcl2d  于 12个月前  发布在  SQLite
关注(0)|答案(1)|浏览(121)

因此,我有一个包含购买记录的数据库,每条记录都有很多列,包括购买者的id和他们的名字。如果我想为客户创建一个新表,我这样做:

Purchasedf = pd.read_csv('Purchase.csv')

conn = sqlite3.connect('Purchase.db')

cursor = conn.cursor()

#The Client table
cursor.execute('''
    CREATE TABLE IF NOT EXISTS Client (
        CustomerID INTEGER PRIMARY KEY UNIQUE,
        CustomerName TEXT,
        CustomerEmail TEXT,
        CustomerPhone TEXT
    );
''')

Purchasedf.to_sql("Client", conn, if_exists='replace')


cursor.execute('''
    SELECT CustomerID
    FROM Client
''')
display(cursor.fetchall())

conn.commit()

字符串
所以我的csv文件看起来像这样:第一行:采购ID,客户ID,客户名称,客户电子邮件,客户电话,产品ID,采购日期
第二排:1,6145,Ethan Smith,email protected(https://stackoverflow.com/cdn-cgi/l/email-protection),555 - 087834,8513,2024 -10-07 16:33:28.557244
现在,如果我尝试从客户端选择CustomerID,我会得到重复的ID。我如何使它们不同?我的意思是我知道我可以选择它们不同,但(PRIMARY KEY)关键字不应该使实际的表与ID不同吗?

tvz2xvvm

tvz2xvvm1#

客户端表在上一次运行中已存在,并且其CustomerID不唯一。
因为您正在运行create table if not exists,并且没有删除表,所以第一次运行代码将创建一个表,该表可能没有主键。
随后的运行将忽略您的create table,因为它已经存在,并重用现有的表。它不会更改架构。
现在,每次运行代码时,都会插入重复的代码。
你可以通过在SQLite shell中运行.schema Client来检查。
这类问题在生产代码中使用schema migration工具处理。

相关问题