【问题标题】:Composite Foreign and Primary Keys复合外键和主键
【发布时间】:2023-03-08 21:10:01
【问题描述】:

我想创建两张表,一张包含唯一的 City 和 Country 值,另一张包含 City、Country、timestamp 和 VisitedDays 的值。 City 和 Country 将是表 1 中的复合主键。

我对下面的脚本有一个问题,即我无法输入一个新行,其中包含先前添加到表 2 中的城市和国家/地区值。换句话说,我无法输入第二次前往同一城市的数据和表 2 中的国家/地区。有没有办法让复合主键和多行具有相同的外键值。根据错误,我的问题与 ID 的 UNIQUE 声明有关。

错误:

psycopg2.IntegrityError:重复键值违反唯一约束“trips_pkey” 详细信息:key (city, country) = (San Juan, Puerto Rico) 已经存在。

注意:我为这个问题减少了大部分脚本。在原始脚本中,表 1(primaryIds)仅在存在不同(城市、国家/地区)时才会填充,而表 2 中会填充每个日志(行程)。此外,我没有为表 2 包括脚本的插入部分,因为它适用于所有条目,除了相同的(城市,国家)。

import sys, psycopg2

with psycopg2.connect("dbname='XXXXX' user='YYYYY' password='ZZZZ'") as outdb:
    cur. outdb.cursor()
    cur.execute("CREATE TABLE primaryIds       "
          "(                                 "
          "City VARCHAR(20) NOT NULL,    "
          "Country VARCHAR(20) NOT NULL, "
          "PRIMARY KEY (City, Country),  "
          "UNIQUE (City)                 "
          ");                            ")
    cur.execute("INSERT INTO primaryIds "
            "(City, Country)"
            " VALUES "
            "(%s, %s)", (a, b))

    cur.execute("CREATE TABLE trips          "
            "(                                     "
            "City VARCHAR(20) NOT NULL,        "     
            "Country VARCHAR(20) NOT NULL,     "
            "Timestamp TIMESTAMP,              "
            "visitedDays INT,                     "
            "Ids VARCHAR(20) REFERENCES primaryIds(City), "
            "PRIMARY KEY (City, Country)                 "
            ");                                ")

【问题讨论】:

    标签: python postgresql


    【解决方案1】:

    您已将 trips 设置为具有城市和国家/地区的复合主键 - 它应该是 City, Countr, Timestamp(如果允许的话)或者您可以自动创建一个名为 tripID 的新字段,它是主键和独特的。我更喜欢tripID。

    【讨论】:

      【解决方案2】:

      这是我的问题的解决方案。

      import sys, psycopg2

      with psycopg2.connect("dbname='XXXXX' user='YYYYY' password='ZZZZ'") as outdb: cur. outdb.cursor() cur.execute("CREATE TABLE primaryIds " "( " "City VARCHAR(20) NOT NULL, " "Country VARCHAR(20) NOT NULL, " "PRIMARY KEY (City, Country) " "); ") cur.execute("INSERT INTO primaryIds " "(City, Country)" " VALUES " "(%s, %s)", (a, b))

      cur.execute("CREATE TABLE trips          "
              "(                                     "
              "City VARCHAR(20) NOT NULL,        "     
              "Country VARCHAR(20) NOT NULL,     "
              "Timestamp TIMESTAMP,              "
              "visitedDays INT,                  "
              "FOREIGN KEY (City, Country) REFERENCES primaryIds(City,Country) "
              ");                                ")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多