检查约束-1

问题描述 投票:1回答:1

我想在表中的列上定义检查约束时对我的含糊之处如下:

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列是正确的。

请帮助我

sql check-constraints
1个回答
1
投票

您没有指定要使用的数据库,但Microsoft SQL Server说:

A 列级CHECK约束只能引用受约束的列,而表级CHECK约束只能引用同一表中的列。

PostgreSQL说:

指定为列约束的检查约束应仅引用该列的值,而出现在表约束中的表达式可以引用多个列。

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)
);
© www.soinside.com 2019 - 2024. All rights reserved.