如何使用空字符串使用空值的主键?

Ram*_*Ram 3 sql oracle null rdbms primary-key

我有一个表,我需要两个值都是主要的,因为我在其他表中引用此组合作为外键.表定义和我需要提供的数据如下

create table T1
(
  sno number(10),
  desc varchar2(10),
  constraint T1_PK primary key(sno,desc)
)
DATA to put
sno    | desc
---------------------------
100    | "hundred"
000    | null
120    | "one twenty"
123    | ""   <EMPTY STRING>
000    | ""   <EMPTY STRING>
Run Code Online (Sandbox Code Playgroud)

这里的问题是desc有时可能为null.主键不能为null所以当我遇到空值时 - 我只是在表中插入"".这里的问题是有时候desc可能有空字符串.如果我插入约数据100,Null和100,""是两个不同的东西,但我无法将它们放在表中.如果为null,我不想放置像'EMPTY'这样的字符串,因为它可能会混淆正在查看表的最终用户.

1)如何将desc作为主键处理null的情况.我无法使用自动序列号.2)如何区分由我引入的空字符串和已存在的空字符串?

Aur*_*ril 8

为什么不引入自动递增的真实主键属性(如id)并在sno和desc上创建索引?


cle*_*tus 6

Oracle将空VARCHAR字段视为的同义词NULL,虽然有些争议,但这是您必须忍受的。因此,您不能将空字符串放入主键,因为您不能将a NULL放入主键。

我的建议?使用说数字的技术主键(在MySQL / SQL Server中从SEQUENCEOracle 自动递增)。在其他字段对上放置唯一索引。所以:

CREATE TABLE t1 (
  id NUMBER(10) PRIMARY KEY,
  sno NUMBER(10),
  desc VARCHAR2(10)
);
CREATE SEQUENCE t1_seq;
Run Code Online (Sandbox Code Playgroud)


小智 5

desc 永远不应该出现在主键中。它根本不需要它。阅读关系数据库理论中的主键是什么。

也就是说,你想要的是不可能的 - 根据关系理论,主键不允许包含“未定义”值,因为它们必须是唯一的 - 这是 SQL 部署的三元逻辑的一部分。

有人确实在你的数据库设计上做得很糟糕。射击不好。