OP 发现 "... 使用 null 值表示没有当前数据不是一个好主意,..."
(这可能是基于意见的。)
我完全不同意这种说法。 NULL 值有一些显着的优势。使用 SQL 为 NULL 值提供的内置本机支持是一个非常好的主意。
通常,NULL 值被描述为表示“未知”值。
是的,在处理 NULL 值时需要注意一些怪癖。与 NULL 值的相等或不相等比较返回 NULL,而不是 TRUE 或 FALSE。我们只需要注意,在 SQL 中,布尔逻辑是三值的,NULL 将 从不 等于 TRUE,从不 等于 FALSE。
这些怪癖实际上是使 NULL 值如此强大的原因。
如果您想使用 NULL 以外的其他机制来表示“无数据”,则需要...
存储表示“无数据”条件的非 NULL“特殊”值,以及用于检查和操作“特殊”值的附加逻辑。
在第二列中存储非 NULL“无数据”指示符/标志,以及与第一列一起处理第二列的填充、检查和操作的附加逻辑。
然后您还需要在外键引用的表中提供虚拟的“无数据”行,因此外键列中的非 NULL“无数据”值有一行可以引用。这就是我认为您在问题中提出的问题...
如果你想声明你的外键列 NOT NULL,并且在没有提供值时有一个默认值,那么这个默认值将需要引用被引用表中的一行。
作为这种方法的演示......注意:我不提倡这是一种适当的设计......只是作为使用 NULL 值表示的“解决方法”的演示“没有数据”。
create table favcolor
( id int not null primary key
, favcolor_name varchar(30) not null
);
create table user
( id int not null primary key
, favcolor_id int not null default '1' comment 'fk, ref favcolor.id'
, constraint FK_user_favcolor foreign key (favcolor_id) references favcolor(id)
);
insert into favcolor (id, favcolor_name) values (1, 'not chosen');
一旦你完成了所有这些,你就会发现旧的 SQL 设计师所做的事情。将这种对“未知”、“无数据”、“未选择”的处理作为 SQL 的本机内置函数将是非常有益的。这就是为什么首先引入 NULL 值来解决这类问题。