为什么需要这个UNIQUE约束?

时间:2016-12-17 01:20:25

标签: sql postgresql

我正在尝试在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"

1 个答案:

答案 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);

这样每个对象只引用一个节点。不可否认,约束并不严格强制对象引用引用同一对象的节点。

如果你想要这种强制执行,你必须创建你所询问的唯一约束条件。