2012-03-31 63 views
1

您好我正在運行在SQL加上下面的查詢默認值列的Oracle 9i中

CREATE TABLE yii_profiles (
    user_id NUMBER(11) NOT NULL, 
    lastname varchar(50) NOT NULL DEFAULT '', 
    firstname varchar(50) NOT NULL DEFAULT '', 
    birthday date NOT NULL DEFAULT '0000-00-00', 
    PRIMARY KEY (user_id) 
); 

我收到以下錯誤。你能告訴我哪裏錯了嗎?我嘗試了各種方法,但沒有成功。 ORA-00907:

在3行錯誤缺少右括號

+0

''0000-00-00''不是有效的日期。如果你想存儲一個值的缺失,使用'NULL' – 2012-03-31 12:45:25

+0

我沒有得到你的觀點,我應該在哪裏使用NULL- – 2012-03-31 12:50:15

+2

如果你想存儲的事實,你不知道的生日,使用NULL值時插入行。這需要列生日爲空。如果你的生日不爲空,你將被迫在那裏放置一些虛擬值,這是一個壞主意。 – 2012-03-31 12:53:25

回答

2

當創建一個約束,你應該明確說明該約束的關鍵字constraint和名稱,以便您在數據庫中,這得到一個合適的名字目的。因爲NOT NULL DEFAULT ''不會工作我刪除了這個並將varchar更改爲varchar2,作爲future behaviour of varchar is not guaranteed

CREATE TABLE yii_profiles (
    user_id NUMBER(11) NOT NULL, 
    lastname varchar2(50) NOT NULL, 
    firstname varchar2(50) NOT NULL, 
    birthday date NOT NULL, 
    constraint pk_yii_profiles PRIMARY KEY (user_id) 
); 

以同樣的方式對NOT NULL列設置默認值不一定一個好主意。如果你想捕捉你的用戶的名字,姓氏和生日,你想要默認他們的東西?

無論是名字必須包括,在這種情況下,此列設置默認值只會造成不正確的數據,或者數據是不需要和列應該是空。就我個人而言,我會刪除birthday的默認值,原因也是一樣的。另外,正如a_horse_with_no_name所指出的那樣,0在Oracle中不能用作日期。

如果birthday並不意味着「出生日期」,而是您的用戶出生週年的那一天,那麼我會考慮改變這一點,並捕捉出生日期而不是生日。你將永遠能夠計算生日,但回到出生日期是不可能的。

+0

我很困惑。 「生日」和「出生日期」之間有什麼區別? – 2012-03-31 12:54:18

+0

@a_horse_with_no_name,'生日'表示每年的每一天以及出生日期。我只是建議如果OP使用前一種含義而不使用後者,那麼存儲出生日期會更好。 – Ben 2012-03-31 12:56:35

+0

謝謝,我沒有意識到這種區別(我不是母語)。但我懷疑生日(如出生日期)應該是'不是空'。 Btw:'主鍵'語法**是**有效的。你不必指定'constraint'子句(Oracle會選擇一個默認名稱) – 2012-03-31 12:58:53