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

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

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

从 JDBC 插入参数值时,如果参数值为 null 或为空,即如果有人从 JDBC 插入 null 值或空值,我想将默认值从 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
4

2 回答 2

0

你可以这样做:

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

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

于 2013-04-15T13:12:18.267 回答
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
;
于 2013-04-15T14:11:23.993 回答