您是否可以拥有外键约束而无需创建另一个表?

时间:2016-09-16 15:55:19

标签: python-3.x database-design sqlite

我不太清楚怎么说这个,所以我举个例子。我有一个程序从用户定义的csv文件读入它的数据库表。 (我在Python中使用SQLite。)

假设我们有桌子:

个人资料(
profile_name TEXT,
分区文字,
分享真实 PRIMARY KEY(profile_name,zoning),

ProfileAssign(
地理TEXT,
今年INTEGER,
PROFILE_NAME TEXT,
主要关键(地理,年),
外国地理参考地理参考地理

我们希望每个地理区域都有相关的分区配置文件。现在说我们还想确保用户不会为地理位置分配不存在的配置文件,即我们希望在 ProfileAssign 表中有一个外键约束:

FOREIGN KEY profile_name REFERENCES个人资料

现在很明显这不可能发生,因为profile_name不是Profile表的主键。我的解决方案是创建一个单独的表,我们可以在其上创建一个外键引用:

个人资料列表(
PROFILE_NAME TEXT,
PRIMARY KEY(profile_name)

这对用户来说非常烦人,因为他们不仅需要定义这些配置文件,他们现在必须在单独的文件中列出所有名称。任何想法如何规避这个?

1 个答案:

答案 0 :(得分:1)

外键需要在父表中标识一行。 这通常使用主键完成,但任何其他唯一键也可以使用;唯一的要求是强制执行唯一性(使用UNIQUE约束):

CREATE TABLE Profile (
  profile_name  TEXT UNIQUE,
  zoning        TEXT,
  ...
  PRIMARY KEY (profile_name, zoning)
);

CREATE TABLE ProfileAssign (
  ...
  FOREIGN KEY profile_name REFERENCES profile(profile_name)
);