SQL表salary中check约束实现加班奖金规则的技术咨询
解决Check约束实现工时超40发放奖金的问题
首先得说,你当前的check_hours约束只做了「工时大于40」的单一检查,完全没关联奖金的逻辑,所以根本没法实现你想要的「工时超过40才发放奖金」的规则。另外你的SQL里两个约束之间还漏了逗号,这会直接导致语法报错,得先补上这个细节。
根据你需求的具体细节,分两种常见场景给出正确的约束写法:
场景1:工时超40必须发放正数奖金,工时不超40奖金只能是0或空
这种场景下,我们要明确绑定两种逻辑:
- 当
work_hours > 40时,bonus必须大于0(确保真的有奖金发放) - 当
work_hours <= 40时,bonus要么是0要么是NULL(完全不发奖金)
对应的完整建表SQL如下:
create table sallaary( E_ID number (10), bank_type varchar(10), creditcardnumber number(12) primary key, bonus number(5), salary_date date, work_hours number (3), constraint check_hours_bonus check ( (work_hours > 40 and bonus > 0) or (work_hours <= 40 and (bonus is null or bonus = 0)) ), constraint sallary2_emp_fk foreign key (E_ID) references salloonee_employee1 );
场景2:工时超40可发可不发奖金,但工时不超40绝对不能发奖金
如果你的需求更宽松——工时不超40时禁止有奖金(只能是0或空),但工时超40时奖金可选(发不发都行),那约束可以简化成:
create table sallaary( E_ID number (10), bank_type varchar(10), creditcardnumber number(12) primary key, bonus number(5), salary_date date, work_hours number (3), constraint check_hours_bonus check ( work_hours > 40 or (bonus is null or bonus = 0) ), constraint sallary2_emp_fk foreign key (E_ID) references salloonee_employee1 );
额外小提醒
- 表名
sallaary看起来像是拼写失误(应该是salary?),如果是笔误建议修正,避免后续维护时混淆。 - 不同数据库对Check约束的支持有差异(比如MySQL早期版本会直接忽略Check约束),如果你的数据库是MySQL,可能需要改用触发器来实现这个逻辑。
内容的提问来源于stack exchange,提问作者yuki
相关产品推荐
相关产品推荐

