我正在尝试在PostgreSQL中设计架构,该架构将包含两个相互交叉引用的表。但是,如果不添加多余的var $headers = $('.body h1'); // select the element
var text = $headers.text(); // get the text of the element
var id = text.trim().split(' ').join('_'); // split by space and join using _
$headers.attr("id", id);
约束(请参阅下面的代码),我会收到错误:UNIQUE
。
所以我的问题是:为什么需要这个额外的唯一约束,有没有办法避免它的创建? (减少运行时开销)。
ERROR: there is no unique constraint matching given keys for referenced table "nodes"
答案 0 :(得分:2)
https://www.postgresql.org/docs/current/static/ddl-constraints.html说:
<强> 5.3.5。外键:
。 。
外键必须引用作为主键或形成唯一约束的列。这意味着引用的列始终具有索引(主键或唯一约束下面的索引);因此,检查引用行是否匹配将是有效的。
https://mariadb.com/kb/en/sql-99/constraint_type-foreign-key-constraint/说:
FOREIGN KEY
约束是&lt;表约束&gt;或者a并定义一个规则,该规则将外键约束为仅匹配引用的唯一键中包含的值的值。
重新评论:
这个想法是每个对象都有与之关联的节点集合,只有一个节点可以是根节点。
ALTER TABLE objects
ADD COLUMN root_node_id integer,
ADD CONSTRAINT objects_nodes_fkey
FOREIGN KEY (root_node_id)
REFERENCES nodes (node_id);
这样每个对象只引用一个节点。不可否认,约束并不严格强制对象引用引用同一对象的节点。
如果你想要这种强制执行,你必须创建你所询问的唯一约束条件。