PostgreSQL UNIQUE 约束和 REFERENCES

PostgreSQL UNIQUE constraint and REFERENCES

假设我有一棵 table 树和一棵 table 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);

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

中添加 2 个相同的名称

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

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

最好的解决方案是(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);