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
Short anser:不,它没有任何意义。外键旨在引用(另一个)表中的(主键)。它不能*其他键和序列提供的值。如果它*是序列提供的值,那么机会很大(〜1.0),这个值将违反FK约束。 – joop
@joop机会很大,他们实际上是* 100%*。事务不适用于PostgreSQL中的序列生成,'nextval()'总是以原子方式执行,并且永远不会回滚(因此始终提供唯一值,但通常在表中存在空位)。 – pozs
注释1.0:= 100%(实际击中现有键值的可能性很小*) – joop