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