PostgreSQL UNIQUE约束和REFERENCES

时间:2016-03-28 00:22:58

标签: sql postgresql unique-constraint

假设我有一个表树和一个表special_tree

CREATE TABLE tree VALUES (name VARCHAR(32) UNIQUE NOT NULL PRIMARY KEY,
                          type VARCHAR(32) NOT NULL);

CREATE TABLE special_tree VALUES (name NOT NULL REFERENCES tree(name),
                                  treat_date DATE,
                                  id INT NOT NULL PRIMARY KEY);

所以我有一个包含具有唯一名称的树列表的表但我想说一棵树可以有多个'treat_date'(出于各种原因)。 由于树(名称)是唯一的,我不能在special_tree中添加2个相同的名称。

唯一的解决方案是从树中删除unique,然后添加到处处理树表的IF表语句,以检查名称是否已经存在? (IF EXISTS (SELECT name FROM tree where tree.name = ...))

2 个答案:

答案 0 :(得分:0)

如果您考虑表name的列tree,则并不意味着所有引用的列也应具有唯一值。看看this example

答案 1 :(得分:0)

最好的解决方案是(对于MySQL):

CREATE TABLE tree VALUES (
  id_t int(11) NOT NULL auto_increment,
  name VARCHAR(32) NOT NULL,
  type VARCHAR(32) NOT NULL,
CONSTRAINT tree_pk PRIMARY KEY (id_t));

CREATE TABLE special_tree VALUES (
  id_st int(11) NOT NULL auto_increment,
  id_t NOT NULL REFERENCES tree(id_t),
  treat_date DATE,
  CONSTRAINT special_tree_pk PRIMARY KEY (id_st));

对于PostgreSQL:

CREATE TABLE tree VALUES (
  id_t serial primary key,
  name VARCHAR(32) NOT NULL,
  type VARCHAR(32) NOT NULL);

CREATE TABLE special_tree VALUES (
  id_st serial primary key,
  id_t NOT NULL REFERENCES tree(id_t),
  treat_date DATE);