2013-04-15 120 views
0

我有一個表來存儲參數名稱添加約束複製列

CREATE TABLE PARAM_NAMES 
{ 

PARAM_TYPE_ID" NUMBER(*,0) NOT NULL ENABLE, 
"PARAM_NAME" VARCHAR2(64 BYTE) NOT NULL ENABLE, 

"DEFAULT_VALUE" VARCHAR2(256 BYTE), 

CONSTRAINT "PARAMS_UK1" UNIQUE ("PARAM_TYPE_ID") 
//PARAM_TYPE ID is the primary key 
} 

我還有其他的表來存儲參數值,

CREATE TABLE PARAM_VALUES" 
    { "ID" NUMBER(*,0) NOT NULL ENABLE, 
    "PARAM_TYPE_ID" NUMBER(*,0) NOT NULL ENABLE, 
    "PARAM_VALUE" VARCHAR2(256 BYTE), 

    CONSTRAINT "PARAM_VALUES_PK" PRIMARY KEY ("ID", "PARAM_TYPE_ID") 
} 

對於PARAM標識特定的參數名我使用ParamId將參數值存儲在另一個表中。

現在我正在使用JDBC來獲取和設置表的值。現在我想做一些這樣的事情。

雖然從JDBC插入參數值我想插入DEFAULT_VALUE如果paramvalue爲空或空,即如果有人從JDBC插入空值或空值我想從PARAM_NAMES表複製默認值PARAM_VALUES表PARAM_VALUE column.Anything我可以在SQL級別或約束級別做?我知道我可以在插入前檢查java中是否null如果不復制默認值,但想知道什麼在SQL級別。

PARAM_TYPE_ID PARAM_NAME   DEFAULT_VALUE 
1     ABC     TEST1 
2     CDE     TEST2 
3     FGH     TEST3 


PARAM_TYPE_ID  PARAM_VALUE 
1     TEST4  //Since not null 
2     TEST2  //since null default value is copied 
3     TEST3   //since null default value is copied 
+0

是否可以更改默認值,如果是,您是否希望該更新值適用於所有默認的'PARAM_VALUES'條目? –

+0

默認值不會改變。但特定的默認值將根據特定的param_type_id進行更新 – constantlearner

回答

0

你可以做這樣的事情:

create table abc (
field1 varchar(10) default 'fred' 

不過,我會用我的應用程序代碼,做這樣的事情迫使空字符串爲默認值。對於字符字段,最終可能會存儲空字符串和數字字段,最終可能會拋出異常。

0

你不能用觸發器做到這一點嗎?這將允許您執行業務規則,而不管插入數據的過程如何。這也將處理更新以及在param_names表中找不到param_type_id的情況。

create or replace trigger trg_param_values 
before insert or update on param_values 
for each row 
begin 
    select default_value into :new.param_value 
    from param_names 
    where param_names.param_type_id = :new.param_type_id 
    ; 
exception 
when others then 
    :new.param_value := 'SOME_DEFAULT_VALUE'; 
end 
;