SQL-根据预定义值插入有效数据
我有两张桌子,城市和郊区。Postgresql代码: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
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引发一个错误/异常
问题:
谢谢您的回答。让客户端的软件操作城市和郊区的记录标识符,而不是它们的值 也可以在服务器端执行此操作:
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阅读您的更新。。。对不起,首先,我只是好奇,我真的不明白这一点:你认为通过全文搜索从分离的表中读取数据会比通过数字索引进行两次连接更快吗?而且要在郊区-城市对范围内保持完整性,你甚至不需要两个表:郊区已经与城市相关了。。。但不管怎样。如果您坚持使用非规范化方法(即使您的论点听起来很奇怪),请注意,在这种情况下,您无论如何都需要两个全文查找,不管您做什么,触发器或客户端验证。请记住,查找记录是其中最重要的部分,获取速度要快得多。