【问题标题】:Postgres: autogenerate primary key in postgres using pythonPostgres:使用python在postgres中自动生成主键
【发布时间】:2015-11-26 06:09:43
【问题描述】:
cursor.execute('UPDATE emp SET name = %(name)s',{"name": name} where ?)

我不明白如何获取特定记录的主键。 我在数据库中有 N 条记录。我想访问那些记录& 操纵。 通过 SELECT 查询我得到了所有记录,但我想相应地更新所有这些记录 有人可以伸出援助之手吗? 提前致谢!

表结构:

ID  CustomerName    ContactName 
1   Alfreds         Futterkiste     
2   Ana             Trujillo 

这里的 ID 是系统在 postgres 中自动生成的。 我正在访问两条记录和更新的 CustomerName。所以当我更新时 最后更新的那些记录也会在第一条记录中被覆盖。

这里我想设置一些条件,以便在根据我的记录执行更新查询时。

后表结构:

ID  CustomerName    ContactName 
1   xyz         Futterkiste     
2   xyz             Trujillo 

这里我想设置第一条记录为 'abc' 第二条记录为 'xyz'

注意:这将使用 PK 完成。但是我不知道如何获得那个PK

【问题讨论】:

  • 你在表中知道什么(如任何列值等)

标签: python postgresql


【解决方案1】:

你的意思是你想使用UPDATE SQL 命令和WHERE 语句:

cursor.execute("UPDATE emp SET CustomerName='abc' WHERE ID=1")
cursor.execute("UPDATE emp SET CustomerName='xyz' WHERE ID=2")

这样您将UPDATE 具有特定 ID 的行。

【讨论】:

  • @Nhor---我不知道 ID。因为系统每次都会自动生成ID
  • 在 Postgresql 系统中自动生成 ID 并以随机模式生成
【解决方案2】:

也许您不喜欢这样,但一般情况下您不应该使用自动生成的密钥。唯一的例外是当您想要插入一些行并且不对它们执行任何其他操作时。正确的解决方案是:

关于更新:

  • 您可以在已知唯一的列集上创建唯一约束(或唯一索引)
  • 但您应该在内部使用标识符标识行。
  • 在引用其他表中的记录时,使用标识符并创建外键约束。 (并非总是如此,但通常这是一种很好的做法。)

现在,当您需要更新一行(例如:一个客户)时,您应该已经知道需要修改哪个客户。因为所有记录都由主键 id 标识,所以您应该已经知道该行的 id。如果你不知道,但是你有一组字段的唯一索引,那么你可以尝试获取 id。例如:

select id from emp where CustomerName='abc'  -- but only if you have a unique constraing on CustomerName!

一般来说,如果你想更新一行,那么你永远不应该这样更新:

update emp set CustomerName='newname' where CustomerName='abc'

即使您对 CustomerName 有唯一约束。解释并不容易,也不适合这里。但是想一想:你可能正在一个事务块中发送更改,并且可能同时有许多打开的事务......

当然,如果您打算更新满足您条件的所有行,可以更新行。

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多