复合外键和主键

时间:2015-08-17 21:42:13

标签: python postgresql

我想创建两个表,其中包含City和Country的唯一值,以及一个包含City,Country,timestamp和VisitedDays值的表。城市和国家将成为表1中的复合主键。

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

错误:

  

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

注意:我为此问题缩减了大部分脚本。在原始脚本中,仅当存在distint(City,Country)时填充表1(primaryIds),并且每个日志(trip)填充表2。此外,我没有包含表2的脚本的插入部分,因为它适用于所有条目,除了相同(城市,国家)。

StackTraceElement[] stackTrace = new Exception().getStackTrace();
String className = stackTrace[stackTrace.length - 1].getClassName();

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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