在 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 级别添加约束以复制列的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 SQL Server 的添加列语句中创建命名默认约束吗?

寻找正确的 sql 语法以将默认值添加到现有表

mysql 复制表结构表数据的方法

sqlserver怎么在查询分析器里给数据列添加唯一约束

sql 检查约束列级别

SQL Server创建 学号 性别 课程编号 check约束 主键约束 UNIQUE约束