在sql级别添加约束以复制列

时间:2013-04-15 13:03:17

标签: sql oracle jdbc plsql

我有一个存储参数名称的表

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")
}

对于带有参数ID的特定参数名称,我使用ParamId将参数值存储在另一个表中。

现在我使用JDBC来获取和设置表的值。现在我想做一些这样的事情。

从JDBC插入param值时我想插入DEFAULT_VALUE如果paramvalue为null或为空,即如果有人从JDBC插入空值或空值,我想将PARAM_NAMES表中的默认值复制到PARAM_VALUES表PARAM_VALUE列。我能做什么在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

2 个答案:

答案 0 :(得分:0)

您可以这样做:

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

但是,我会使用我的应用程序代码来执行将空字符串强制为默认值的操作。对于字符字段,您最终可能会存储空字符串,而对于数字字段,最终可能会抛出异常。

答案 1 :(得分: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
;