Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-根据预定义值插入有效数据_Sql_Postgresql - Fatal编程技术网

SQL-根据预定义值插入有效数据

SQL-根据预定义值插入有效数据,sql,postgresql,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 NO

我有两张桌子,城市和郊区。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
)
我想确保地址中只插入冗余的信息副本。以下是一个例子:

我想允许在地址中插入所有城市名称-郊区名称对:

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
但如果有人想在地址中插入-Y对,我希望DBMS引发一个错误/异常

问题:

  • 检查这样的约束有意义吗

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

  • 我更喜欢独立于DBSM的解决方案。我更感兴趣的是建议解决方案的基本思想,而不是特定于postgresql的解决方案

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

    我的计划是上载包含大量数据的城市和郊区表,并使用它们验证地址表中的插入。我不想让我的用户插入地址,例如:“纽约-法蒂玛·宾特·穆巴拉克街”,因为法蒂玛·宾特·穆巴拉克街在阿布扎比


    谢谢您的回答。

    让客户端的软件操作城市和郊区的记录标识符,而不是它们的值

    也可以在服务器端执行此操作:

    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),
    )
    
    当然,在插入之前,您需要进行两次查找操作,基本上是按城市/郊区的名称进行两次选择,以检索这些ID(或拒绝操作)


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

    为什么不使用主键而不是唯一键?您的id列中是否有空值?更新,thx@TEJA城市名称和郊区名称的唯一约束可能会导致问题,因为两个不同的郊区可能共享相同的名称-例如密苏里州里士满高地(圣路易斯)和俄亥俄州里士满高地(克利夫兰)。以及两个城市——伊利诺伊州斯普林菲尔德和密苏里州斯普林菲尔德。可以添加一个类似的“state”表,其中city.state\u id引用state.id,以帮助区分。您还可以考虑将“地址”表放入视图中,并将插入单独处理到每个表中。插入测试值并向我们显示您想要的和不想要的。或者你想拒绝什么。A-X-Y-V完全脱离了你的模式。我理解你的观点。请看我更新的问题。谢谢@Yuri Gjust阅读您的更新。。。对不起,首先,我只是好奇,我真的不明白这一点:你认为通过全文搜索从分离的表中读取数据会比通过数字索引进行两次连接更快吗?而且要在郊区-城市对范围内保持完整性,你甚至不需要两个表:郊区已经与城市相关了。。。但不管怎样。如果您坚持使用非规范化方法(即使您的论点听起来很奇怪),请注意,在这种情况下,您无论如何都需要两个全文查找,不管您做什么,触发器或客户端验证。请记住,查找记录是其中最重要的部分,获取速度要快得多。