繁体   English   中英

复合外键和主键

[英]Composite Foreign and Primary Keys

我想创建两个表,一个表包含City和Country的唯一值,另一个表包含City,Country,timestamp和VisitedDays的值。 城市和国家/地区将是表1中的复合主键。

我的以下脚本有一个问题,就是我无法输入之前已添加到表2中的城市和国家/地区值的新行。换句话说,我无法输入第二次前往同一城市和国家/地区的数据表2。有没有一种方法可以拥有复合主键并具有具有相同外键值的多行。 基于该错误,我的问题与ID的UNIQUE声明有关。

错误:

psycopg2.IntegrityError:重复的键值违反了唯一约束“ trips_pkey”详细信息:键(城市,国家)=(波多黎各圣胡安)已存在。

注意:针对该问题,我减少了大部分脚本。 在原始脚本中,仅在有区别(城市,国家/地区)时填充表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)                 "
            ");                                ")

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

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

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) " "); ") 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) "
        ");                                ")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM