[英]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.