如何使用空字符串设置具有空值的主键?

4

我有一张表格,需要将其中的两个值设置为主键,因为我在其他表中引用了这个组合作为外键。表格定义和我需要填写的数据如下:

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>

问题在于desc有时可能为空。主键不能为空,所以当我遇到空值时,我只是在表中插入""。问题在于有时候desc可能是空字符串。 如果我插入关于数据100,Null和100,“”是两个不同的东西,但我无法将它们放入表中。我不想在null的情况下放置一些字符串,比如'EMPTY',因为这可能会让查看表的最终用户感到困惑。

1)如何处理desc的null情况,同时保持它作为主键。我不能使用自动序列号。 2)如何区分由我引入的null字符串和已经存在的null字符串?


为什么不在记录中使用EMPTY而不是null,并使用NULLIF('EMPTY',desc)函数将结果返回给最终用户? - garik
谢谢IGOR,这似乎是一个好主意...再次感谢。 - Ram
4个回答

7
为什么不引入一个真正的主键属性(例如id),它是自动递增的,并在sno和desc上创建一个索引?

1
一个基于sno和desc的唯一索引或约束。 - John Saunders
1
一个普通索引用于更快的搜索,和一个约束条件用于处理空和空字符串,因为唯一索引是不可能的。您可以创建一个存储过程来处理数据插入,以确保唯一性。 - Aurril

6
Oracle将空的VARCHAR字段视为与NULL同义,这在某种程度上是有争议的,但您必须接受它。因此,您不能将空字符串放入主键中,因为您不能将NULL放入主键中。
我的建议是使用一个技术主键,例如数字(在MySQL/SQL Server中自动递增,在Oracle中从序列中获取)。在其他字段的对中放置唯一索引。因此:
CREATE TABLE t1 (
  id NUMBER(10) PRIMARY KEY,
  sno NUMBER(10),
  desc VARCHAR2(10)
);
CREATE SEQUENCE t1_seq;

5

描述信息不应该出现在主键中,因为它根本没有这个必要。请阅读关系数据库理论中的主键概念。

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

某人在你的数据库设计上真的做得很糟糕。解雇他。


0
使用CHAR而不是VARCHAR。空字符串将变为空白。需要设置一个空格代替空字符串,以避免Oracle将空字符串转换为NULL。请注意,在CHAR字段上,一个空格与两个空格、三个空格相同...(但对于Oracle来说,它与零空格不同)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接