2016-11-11 73 views
2

我分析如下PostgreSQL模式:PostgreSQL的NOT NULL外键和缺省值与序列

CREATE SEQUENCE ref_email_type_ref_email_type_id_seq 
    INCREMENT 1 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 1 
    CACHE 1; 

CREATE TABLE ref_email_type 
(
    ref_email_type_id integer NOT NULL DEFAULT nextval('ref_email_type_ref_email_type_id_seq'::regclass), 
    description character varying(50) NOT NULL, 
    CONSTRAINT ref_email_type_pkey PRIMARY KEY (ref_email_type_id) 
) 

CREATE TABLE email 
(
    email_id integer NOT NULL DEFAULT nextval('email_email_id_seq'::regclass), 
    ref_email_type_id integer NOT NULL DEFAULT nextval('email_ref_email_type_id_seq'::regclass), 
    email_address character varying(100), 
    CONSTRAINT email_pkey PRIMARY KEY (email_id), 
    CONSTRAINT email_ref_email_type_id_fkey FOREIGN KEY (ref_email_type_id) 
     REFERENCES ref_email_type (ref_email_type_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

这有什么意义,有在NOT NULL情况下DEFAULT nextval('email_ref_email_type_id_seq'::regclass)和现有的约束宣布email.ref_email_type_id

CONSTRAINT email_ref_email_type_id_fkey FOREIGN KEY (ref_email_type_id) 
     REFERENCES ref_email_type (ref_email_type_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
+1

Short anser:不,它没有任何意义。外键旨在引用(另一个)表中的(主键)。它不能*其他键和序列提供的值。如果它*是序列提供的值,那么机会很大(〜1.0),这个值将违反FK约束。 – joop

+0

@joop机会很大,他们实际上是* 100%*。事务不适用于PostgreSQL中的序列生成,'nextval()'总是以原子方式执行,并且永远不会回滚(因此始终提供唯一值,但通常在表中存在空位)。 – pozs

+0

注释1.0:= 100%(实际击中现有键值的可能性很小*) – joop

回答

1

不,这根本没有任何意义。

它也不会造成任何伤害,因为默认值可能永远不会被使用。