我有一个存储参数名称的表
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
答案 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
;