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

dauxcl2d  于 2023-11-21  发布在  SQLite
关注(0)|答案(1)|浏览(164)

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

  1. Purchasedf = pd.read_csv('Purchase.csv')
  2. conn = sqlite3.connect('Purchase.db')
  3. cursor = conn.cursor()
  4. #The Client table
  5. cursor.execute('''
  6. CREATE TABLE IF NOT EXISTS Client (
  7. CustomerID INTEGER PRIMARY KEY UNIQUE,
  8. CustomerName TEXT,
  9. CustomerEmail TEXT,
  10. CustomerPhone TEXT
  11. );
  12. ''')
  13. Purchasedf.to_sql("Client", conn, if_exists='replace')
  14. cursor.execute('''
  15. SELECT CustomerID
  16. FROM Client
  17. ''')
  18. display(cursor.fetchall())
  19. 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工具处理。

相关问题