2010-03-11 22 views
3

我有一個表,我需要這兩個值是主要的,因爲我引用這個組合作爲外鍵在其他表中。表格定義和我需要放的數據如下如何使用空字符串具有空值的主鍵?

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,「」是兩個不同的東西,但我無法將它們放在表格中。如果爲空,我不想放置像'EMPTY'這樣的字符串,因爲它可能會混淆正在查看錶格的最終用戶。

1)我如何處理desc的空例,並將其作爲主鍵。我不能使用自動序列號。 2)如何區分由我引入的空字符串和已經存在的空字符串?

+0

爲什麼不在記錄中使用EMPTY而不是null,並使用NULLIF('EMPTY',desc)函數將結果返回給最終用戶? – garik 2010-03-11 08:41:42

+0

感謝IGOR,這似乎是一個不錯的想法..再次感謝 – Ram 2010-03-11 11:57:05

回答

8

你爲什麼不介紹這是自動遞增的一個真正的主鍵屬性(如ID),並創建了SnO和desc的指標?

+1

一個獨特的索引或約束sno和desc。 – 2010-03-11 08:39:00

+0

快速搜索的正常索引和唯一性約束,它處理空字符串和空字符串,因爲唯一索引是不可能的。您可以創建一個存儲過程來處理數據的插入,以保證唯一性。 – Aurril 2010-03-11 08:41:51

4

Oracle將空VARCHAR字段視爲NULL的同義字,這有點爭議,但它是您必須忍受的事情。所以你不能把一個空字符串放到主鍵中,因爲你不能把NULL放到主鍵中。

我的建議是?使用一個數字的技術主鍵(在MySQL/SQL Server中自動遞增,從Oracle中的SEQUENCE)。將一個唯一的索引放在其他字段對上。所以:

CREATE TABLE t1 (
    id NUMBER(10) PRIMARY KEY, 
    sno NUMBER(10), 
    desc VARCHAR2(10) 
); 
CREATE SEQUENCE t1_seq; 
3

desc不應永遠處於主鍵中。它根本不需要它。在關係數據庫理論中讀一讀主鍵。

這就是說,你想要的是不可能的 - 根據關係理論,主鍵不允許包含「未定義」值,因爲它們必須是唯一的 - 這是三元邏輯SQL部署的一部分。

有人真的在你的數據庫設計上做得不好。燒壞。

0

使用CHAR而不是VARCHAR。空白將爲空白。需要設置空白字符串而不是空字符串,以避免Oracle將空字符串轉換爲NULL。請注意,在CHAR字段中,空格與兩個空格,三個空格......(但它不同於Oracle的零空格)相同。

相關問題