在 sql 级别添加约束以复制列
Posted
技术标签:
【中文标题】在 sql 级别添加约束以复制列【英文标题】:Adding constraint at sql level to copy column 【发布时间】:2013-04-15 13:03:16 【问题描述】:我有一个表来存储参数名称
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 插入参数值时,如果参数值为空或为空,即如果有人从 JDBC 插入空值或空值,我想插入 DEFAULT_VALUE,我想将 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
【问题讨论】:
可以更改默认值吗?如果可以,您是否希望将更新后的值应用于所有默认的PARAM_VALUES
条目?
默认值不会改变。但特定的默认值将根据特定的 param_type_id 进行更新
【参考方案1】:
你可以这样做:
create table abc (
field1 varchar(10) default 'fred'
但是,我会使用我的应用程序代码来执行诸如将空字符串强制为默认值之类的事情。对于字符字段,您最终可能会存储空字符串,而对于数字字段,您最终可能会抛出异常。
【讨论】:
【参考方案2】:你不能用触发器做到这一点吗?这将允许您执行您的业务规则,而不管插入数据的过程如何。这还将处理更新以及在 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
;
【讨论】:
以上是关于在 sql 级别添加约束以复制列的主要内容,如果未能解决你的问题,请参考以下文章