我想在表中的列上定义检查约束时对我的含糊之处如下:
Create test
(
emp_id number(8) ,
salary number(9,2) constraint test_sal_check CHECK(salary>0,emp_id between 0 and 9)
);
在这种情况下,在薪水列的约束内使用emp_id列是正确的。
请帮助我
您没有指定要使用的数据库,但Microsoft SQL Server说:
A 列级
CHECK
约束只能引用受约束的列,而表级CHECK
约束只能引用同一表中的列。
指定为列约束的检查约束应仅引用该列的值,而出现在表约束中的表达式可以引用多个列。
Oracle说:
检查约束的内联和外联指定的语法是相同的。但是,内联规范只能引用该列(或者如果是对象列,则为该列的属性)当前正在定义,而外联规范可以引用多个列或属性。
您可以看到,他们都同意,尽管PostgreSQL可能更宽容(使用“ should”)。
此外,CHECK(expr)
参数是expression,这意味着,
逗号无效。
您有多种选择:
CREATE test (
emp_id NUMBER(8) CONSTRAINT test_emp_check CHECK(emp_id BETWEEN 0 AND 9),
salary NUMBER(9,2) CONSTRAINT test_sal_check CHECK(salary > 0)
);
CREATE test (
emp_id NUMBER(8),
salary NUMBER(9,2),
CONSTRAINT test_sal_check CHECK(salary > 0),
CONSTRAINT test_emp_check CHECK(emp_id BETWEEN 0 AND 9)
);
CREATE test (
emp_id NUMBER(8),
salary NUMBER(9,2),
CONSTRAINT test_check CHECK(salary > 0 AND emp_id BETWEEN 0 AND 9)
);
如果您的约束条件表示“工资> 0 when emp_id在0到9之间,则请执行以下操作:
CREATE test (
emp_id NUMBER(8),
salary NUMBER(9,2),
CONSTRAINT test_sal_check CHECK(salary > 0 OR emp_id NOT BETWEEN 0 AND 9)
);