【问题标题】:Define an SQL constraint depending on more than one attribute根据多个属性定义 SQL 约束
【发布时间】:2019-11-21 09:28:41
【问题描述】:

我有这个定义的类型和表:

CREATE TYPE emp_role AS ENUM ('Manager','Developer','Accountant','Secretary');
CREATE TABLE employees (
employee_id int NOT NULL UNIQUE,
lastname text NOT NULL,
firstname text NOT NULL,
address text NOT NULL,
hire_date date NOT NULL,
salary numeric NOT NULL CHECK(salary > 1.500), 
emp_role emp_role,
department_id int NOT NULL
);

我想在这个表上创建一个约束,而不修改它的定义,它同时依赖于属性hire_datesalaryemp_role,这意味着例如具有emp_role的员工Manager2019-21-11 之后聘用的salary不能比15.000大,所以这样的查询应该返回错误:

INSERT INTO employees VALUES(2,'foo','bar','foostreet','2019-12-20',18.0000,'Manager',3);

我不知道怎么做

【问题讨论】:

    标签: sql postgresql constraints ddl


    【解决方案1】:

    您可以按如下方式创建多列检查约束:

    CREATE TYPE emp_role AS ENUM ('Manager','Developer','Accountant','Secretary');
    
    CREATE TABLE employees (
        employee_id int NOT NULL UNIQUE,
        lastname text NOT NULL,
        firstname text NOT NULL,
        address text NOT NULL,
        hire_date date NOT NULL,
        salary numeric NOT NULL CHECK(salary > 1500), 
        emp_role emp_role,
        department_id int NOT NULL
        CONSTRAINT CK_employee CHECK (
            NOT(
                emp_role = 'Manager' 
                AND hire_date > DATE'2019-11-21' 
                AND salary > 15000
            )
        )
    );
    

    Demo on DB Fiddle

    INSERT INTO employees VALUES(2,'foo','bar','foostreet','2019-12-20',180000,'Manager',3);
    
    错误:关系“员工”的新行违反检​​查约束“ck_employee” 详细信息:失败行包含 (2, foo, bar, foostreet, 2019-12-20, 180000, Manager, 3)。
    INSERT INTO employees VALUES(2,'foo','bar','foostreet','2019-12-20',1,'Developer',3);
    
    错误:关系“employees”的新行违反了检查约束“employees_salary_check” 详细信息:失败行包含 (2, foo, bar, foostreet, 2019-12-20, 1, Developer, 3)。

    【讨论】:

    • 1.500 应该是 15000 因为“工资不能超过 15.000
    • @a_horse_with_no_name:确实是的,原始代码与问题的文本不匹配。我修改了那个。
    • 我认为它需要是一个 OR 条件。如果是经理,则不能高于 15000,但如果是普通员工,则应高于 1.5(这是问题中的原始检查约束)
    • @a_horse_with_no_name: 或者我们应该只保留salary > 1.5 上的原始检查约束?
    • @aniani2020:在 SQL 中 1.500 表示“一点五”(=一点半),不是一千五百
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2021-02-03
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多