繁体   English   中英

PostgreSQL UNIQUE约束和参考

[英]PostgreSQL UNIQUE constraint and REFERENCES

假设我有一个表树和一个表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”(出于各种原因)。 由于tree(name)是唯一的,因此无法在special_tree中添加2个相同的名称。

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

如果考虑表tree的列name ,并不意味着所有引用的列也应具有唯一值。 这个例子

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM