SQL - 根据预定义的值

时间:2017-04-14 18:43:18

标签: sql postgresql

我有两张桌子城市和郊区。 Postgresql代码:

CREATE TABLE city 
(
  id uuid PRIMARY KEY,
  name character varying NOT NULL,
  CONSTRAINT city_id_key UNIQUE (id),
  CONSTRAINT city_name_key UNIQUE (name)
)

CREATE TABLE suburb
(
  id uuid PRIMARY KEY,
  city_id uuid NOT NULL,
  name character varying NOT NULL,
  CONSTRAINT fk_suburb_city FOREIGN KEY (city_id) REFERENCES city (id),
  CONSTRAINT suburb_id_key UNIQUE (id),
  CONSTRAINT suburb_name_key UNIQUE (name)
)

我想创建一个名为address的表来存储城市+郊区对。这是地址表的DDL:

CREATE TABLE address
(
  id uuid NOT NULL,
  city_name character varying NOT NULL,
  suburb_name character varying NOT NULL
)

我想确保只将冗余的信息副本插入到地址中。这是一个例子:

我想允许插入所有city_name suburb_name对的地址:

SELECT c.name AS city_name, s.name AS suburb_name
  FROM city c, suburb s
 WHERE c.id = s.city_id

结果:

A - B
A - C
X - Y

对于上面的数据,我想允许所有对:

A - B
A - C
X - Y

但如果有人想将A - Y对插入地址,我希望DBMS引发错误/异常。

问题:

  1. 检查这样的约束是否有意义?

  2. 如果这是一个有效的想法,那么最佳解决方案是什么?触发器,存储过程,某种约束?

  3. 我更喜欢DBSM独立解决方案。我对建议的解决方案的基本概念更感兴趣,而不是在postgresql特定的解决方案中。

    反映@Yuri G的回答:当我阅读表格地址时,我不想要任何加入。我想在其中存储实际值而不是ID。缓慢插入地址不是问题。快速阅读对我来说很重要。插入地址后,城市或郊区表的变化不是问题。所以不需要在地址表中更新。我只是想确保我插入地址的数据是一个有效的城市 - 郊区对(根据城市和郊区表)。

    我的计划是上传包含大量数据的城市和郊区表格,并使用它们来验证地址表中的插入内容。我不想让我的用户插入地址,例如:“New York - Fatima bint Mubarak St”,因为Fatima bint Mubarak St.在阿布扎比。

    感谢您的回答。

1 个答案:

答案 0 :(得分:0)

让客户端的软件操作City&的记录标识符。郊区,而不是他们的价值观。

在服务器端也这样做:

CREATE TABLE address
(
  id uuid NOT NULL,
  city_id character varying NOT NULL,
  suburb_id character varying NOT NULL,
  CONSTRAINT fk_city FOREIGN KEY (city_id) REFERENCES city (id),
  CONSTRAINT fk_suburb FOREIGN KEY (suburb_id) REFERENCES suburb (id),
)

当然,在插入之前你需要进行2次查找操作,基本上是按城市/郊区的名称选择两个,以检索这些ID(或拒绝操作)。

通过这种方式,您可以保持数据完整性最简单&有效的方式,我相信。