ORACLE CHECK CONSTRAINT使用示例(转载)

看下面的例子:
CREATE TABLE temp (age NUMBER(3));

ALTER TABLE temp ADD CONSTRAINT ck_temp_age CHECK
((AGE>0) AND (AGE <= 125));
现在我们能够插入Age表的集合是{1,2,…,125}或null,这和我们实际的现实生活是符合的。
为限制Age字段取值范围不能为空,增加not null约束。
CREATE TABLE temp (age NUMBER(3) NOT NULL);

ALTER TABLE temp ADD CONSTRAINT ck_temp_age CHECK
((AGE>0) AND (AGE<=125));

下面的操作就会获得一个oracle错误:
SQL> insert into temp values (130);
insert into temp values (130)
*
ORA-02290: check constraint (SCOTT.CK_TEMP_AGE) violated.

当Oracle 执行插入操作时,会检查Check约束条件表达式结果是否为TRUE,不为TRUE则拒绝执行。

Check约束可以使用组合条件:
CREATE TABLE temp (a NUMBER);
ALTER TABLE temp ADD CONSTRAINT ck_temp_a CHECK
(((a>=0) AND (a<=10)) OR (a=999) OR (a=9999));

Oracle中没有Boolean类型,PL/SQL有Boolean类型.为了替代一个boolean列使用check约束

CREATE TABLE temp(enabled NUMBER(1) NOT NULL);
ALTER TABLE temp ADD CONSTRAINT ck_temp_enabled CHECK
(enabled IN (0, 1));

也可以使用varchar2类型

CREATE TABLE temp(enabled VARCHAR2(1) NOT NULL);
ALTER TABLE temp ADD CONSTRAINT ck_temp_enabled CHECK
(enabled IN ('T', 'F', 't', 'f'));


CREATE TABLE temp(status VARCHAR2(16) NOT NULL);
ALTER TABLE temp ADD CONSTRAINT ck_temp_status CHECK
(status IN
('RECEIVED','APPROVED','WAITING APPROVAL'));


一、多字段约束
Check约束可以是一个多字段的组合,如下:
CREATE TABLE box
(length NUMBER(2) NOT NULL,
width NUMBER(2) NOT NULL,
height NUMBER(2) NOT NULL);

ALTER TABLE box ADD CONSTRAINT ck_box_volume CHECK
((length*width*height<100) AND
(length > 0) AND (length <= 10) AND
(width > 0) AND (width <= 10) AND
(height > 0) AND (height <= 10));

也可以以不同的名字定义多个Check约束
ALTER TABLE box ADD CONSTRAINT ck_box_length CHECK
((length > 0) AND (length <= 10));
ALTER TABLE box ADD CONSTRAINT ck_box_width CHECK
((width > 0) AND (width <= 10));
ALTER TABLE box ADD CONSTRAINT ck_box_height CHECK
((height > 0) AND (height <= 10));
ALTER TABLE box ADD CONSTRAINT ck_box_dimension CHECK
((length*width*height<100));

二、补充Unique约束
Check约束可以被用于多行非空约束,即同时为空或同时不为空。Unique约束的两个字段可能有一个为null,而另一个不为null,如果我们不想它出现这种情况,我们就可以用Check约束:
(both columns are NULL) OR (both columns are NOT NULL)

CREATE TABLE temp (pk NUMBER PRIMARY KEY, a NUMBER, b NUMBER);
ALTER TABLE temp
ADD CONSTRAINT uk_temp_a_b UNIQUE (a, b);
ALTER TABLE temp ADD CONSTRAINT ck_temp_a_b
CHECK ((a IS NULL AND b IS NULL) OR
(a IS NOT NULL AND b is NOT NULL));


Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=595502
### L1 范数盒约束优化 在最优化问题中,L1范数盒约束指的是变量不仅受到线性不等式的限制,还被限定在一个特定范围内。这类约束通常表示为: \[ \min_{x} f(x) \quad \text{subject to } \|x\|_1 \leq t, l_i \leq x_i \leq u_i \] 其中 \(f(x)\) 是目标函数,\(t\) 表示L1范数的最大允许值,而 \(l_i\) 和 \(u_i\) 则分别代表每个决策变量的上下界。 对于带有L1范数盒约束的问题,在实际应用中有多种方法可以解决。一种常见的策略是采用内点法或梯度投影算法来处理这些约束条件[^1]。另一种有效的方法是在求解过程中引入松弛变量,并通过调整惩罚参数逐步逼近最优解。 当涉及到具体实现时,像MATLAB这样的软件环境提供了丰富的工具箱支持此类计算需求。例如,`l1-magic` 工具箱能够用于求解基追踪 (BP) 及其变体——基追踪降噪 (BPDN)。如果要针对大规模数据集解决问题,则可能需要利用 `cgsolve.m` 函数来进行更高效的迭代求解过程。 ```matlab % 假设我们有一个简单的带L1范数盒约束的目标最小化问题 function [x_optimal, obj_value] = solve_l1_box_constrained_problem(A, b, lb, ub, lambda) % A: 系统矩阵; b: 观测向量; % lb,ub: 下限和上限边界数组; % lambda: 正则化系数 n = length(b); options = optimoptions('fmincon', 'Algorithm', 'interior-point'); nonlcon = @(x)deal([], sum(abs(x)) - lambda); % 定义非线性约束作为L1范数小于等于lambda x0 = zeros(n, 1); % 初始化猜测解 [x_optimal, obj_value] = fmincon(@(x)norm(A*x-b)^2/2, ... x0, [], [], [], [], lb, ub, nonlcon, options); end ``` 此代码片段展示了如何设置并调用 MATLAB 的内置优化器 `fmincon` 来寻找满足给定L1范数盒约束条件下使二次损失最小化的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值