我想创建两个表,其中包含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();
答案 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) "
"); ")