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)如何区分由我引入的空字符串和已存在的空字符串?
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 部署的三元逻辑的一部分。
有人确实在你的数据库设计上做得很糟糕。射击不好。