在创建表时在 sqlite3 中指定列会自动使其与众不同吗?

Does specifying a column in sqlite3 while creating a table automatically make it distinct?

提问人:Xayyna 提问时间:11/10/2023 最后编辑:Xayyna 更新时间:11/10/2023 访问量:35

问:

所以我有一个数据库,里面有购买记录,每条记录都有很多列,包括购买者的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文件看起来像这样: 第一行: PurchaseID、CustomerID、CustomerName、CustomerEmail、CustomerPhone、ProductID、Purchase_Date

第二排: 1,6145,伊桑·史密斯,[email protected],555-087834,8513,2024-10-07 16:33:28.557244

现在,如果我尝试从客户端选择 CustomerID,我会得到重复的 ID。 我怎样才能使它们与众不同?我的意思是我知道我可以清楚地选择它们,但是 (PRIMARY KEY) 关键字不应该使实际表与 ID 不同吗?

python sql 数据库 sqlite

评论

0赞 Barmar 11/10/2023
主键始终是不同的,您不应该得到任何重复项。请发布一个最小的可重现示例来说明这一点。
0赞 nbk 11/10/2023
然后,您还应该向我们展示选择代码和处理
0赞 Barmar 11/10/2023
这是作为 ?要联接的表中可能有多行与同一客户 ID 相关。JOIN
0赞 Xayyna 11/10/2023
我更新了它,所以它更清楚,我认为我的代码没有问题,但我认为从逻辑上讲,我不明白如何在 sql 中从数据库制作表。我是否必须将我想要的值放在另一个数据帧中?
0赞 Xayyna 11/10/2023
我的输出如下所示:(6145,),(6145,),(6145,),(6148,),(6148,),(6148,),.....

答:

2赞 Schwern 11/10/2023 #1

Client 表在上一次运行中已存在,并且其 CustomerID 不是唯一的。


因为您正在运行 ,并且您没有删除表,所以第一次运行代码将创建一个表。据推测,该表没有主键。create table if not exists

后续运行将忽略 你的 ,因为它已经存在,并重用现有表。它不会更改架构。create table

现在,每次运行代码时,都会插入重复项。

您可以通过在 SQLite shell 中运行来检查。.schema Client

此类问题在生产代码中使用架构迁移工具进行处理。

评论

0赞 Xayyna 11/10/2023
即使我删除了以前的数据库并重新运行,它仍然会给出重复的 id。
0赞 Xayyna 11/10/2023
我实际上尝试打印我的客户端表,它打印了数据帧中的所有列?
0赞 Xayyna 11/10/2023
unique_clients_df = BookingDetailsDf[['CustomerID', 'CustomerName', 'CustomerEmail', 'CustomerPhone']].drop_duplicates() # Write the unique client information to the Client table unique_clients_df.to_sql("Client", conn, if_exists="replace", index=False)我最终这样做了,但我必须再做几张这样的桌子,这不是多余的吗?或者这是处理类似事情的正确方法吗?
1赞 Schwern 11/11/2023
@Xayyna 1) 说什么?它是否显示 CustomerID 是主键?2)对不起,我不知道该代码是做什么的。如果您询问是否应该在每次运行程序时重新创建表,这取决于您要完成的任务。.schema Client
0赞 Xayyna 11/11/2023
否,它显示 Client 表包含大数据库中的所有列。我试图用一个 csv 文件制作不同的表,我发现为每个表制作一个单独的数据帧是最好的方法。