【发布时间】:2015-05-16 05:59:26
【问题描述】:
我正在用元素和它们之间的连接编写绘图表面。
我的两个表面表如下所示:
CREATE TABLE element
(
elid character varying(60) NOT NULL,
data json,
surface_id character varying(60) NOT NULL,
type character varying,
CONSTRAINT element_primary_key PRIMARY KEY (elid),
)
CREATE TABLE connection
(
from_elid character varying(60) NOT NULL,
to_elid character varying(60) NOT NULL,
CONSTRAINT from_to_element_id PRIMARY KEY (from_elid, to_elid),
CONSTRAINT from_element_fk FOREIGN KEY (from_elid)
REFERENCES element (elid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT to_element_fk FOREIGN KEY (to_elid)
REFERENCES element (elid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
)
如果我删除表面上的一个元素,它也会删除相应的连接,它由connection 约束表示。
在这种情况下,我会检查所有具有相同 surface_id 的元素,而那些缺失的元素将被删除(以及它们的连接)。
但是在绘图表面上被删除时如何显式删除连接?由于from_elid 和to_elid 仍然存在于element 表中?
编辑:为了保存绘图表面,所有元素和它们之间的连接都由客户端发送到服务器。
数据库中的示例数据:
-------------------------------- ---------------------
|element | |connection |
-------------------------------- ---------------------
|elid | data |surface_id |type | |from_elid |to_elid |
--------------------------------- ---------------------
|e1 |{} |s1 |xxx | |e1 |e2 |
|e2 |{} |s1 |xxx | |e2 |e3 |
|e3 |{} |s1 |xxx | |e3 |e4 |
|e4 |{} |s1 |xxx | |.. |.. |
|e5 |{} |s2 |xxx | |e5 |e6 |
|e6 |{} |s2 |xxx | |e6 |e7 |
|.. |.. |.. |... | |.. |.. |
--------------------------------- ---------------------
客户端发送的示例数据:
{
surface_id: 's1',
elements:['e1','e2','e3','e4'],
connections:[
{from:'e2', to:'e3'},
{from:'e3', to:'e4'}
]
}
在示例数据中,e1 和 e2 之间的连接缺失,这意味着它在绘图表面上被删除,surface_id = 's1' 并且必须从表 connection 中删除.如何使用给定的数据实现这一点,而不是删除带有surface_id = 's2' 的元素之间的连接?
【问题讨论】:
-
对不起,我不明白:“但删除没有连接元素的单个连接需要另一种方法” - 只需从
connection表中删除行。这不会自动删除元素。 -
好的,如果你想删除一个连接,你的查询会是什么样子,如果你关于它被删除的唯一信息是它不是由客户端发送的(只发送当前元素和连接)
-
抱歉,您需要比这更具体。这个“客户”到底是什么东西?它向数据库发送了什么?如果该客户端与数据库通信,那么它为什么不能简单地删除不再需要的连接(使用简单的
delete from connection where ...) -
我明白了,用示例数据再次改变了我的问题
标签: sql postgresql foreign-keys sql-delete