我正在尝试编写一些DDL代码,要求提供数字范围,但在互联网上找不到任何内容。到目前为止,我有:
create table Section (
c# numeric(10),
se# numeric(10),
emp# numeric(5),
time numeric(5),
constraint Section_PK primary key (c#, se#),
constraint Section_FK_Course foreign key (c#) references Course,
constraint Section_FK_Employee foreign key (emp#) references Employee
)
我的障碍是,我需要将"控制号"设置为40到60之间的任何数字,并默认为20,同时,如果c#在3000到4000之间,则控制号必须小于40。
我真的很困惑该怎么做。这是一种"如果-那么"的说法吗?我以前从来没有做过这样的事,也不知道从哪里开始寻找。
您可以查看检查约束:
检查约束是SQL中的一种完整性约束指定数据库中每一行必须满足的要求桌子约束必须是谓词。它可以指单个或表的多列。谓词的结果可以是TRUE、FALSE或UNKNOWN,具体取决于NULL的存在。如果谓词的计算结果为UNKNOWN,则约束不是违反,并且可以在表中插入或更新该行。这是与SELECT或UPDATE中WHERE子句中的谓词相反声明。
例如,在包含产品的表中,可以添加一个复选框限制,使得产品的价格和产品的数量是非负值:
PRICE >= 0
QUANTITY >= 0
如果没有这些限制,可能会出现负价格(−30美元)或负数量(−3件)。
检查约束用于确保数据库并提供数据完整性。如果在数据库级别,使用该数据库的应用程序将无法添加无效数据或修改有效数据,使得数据变得无效,即使应用程序本身接受无效数据。
不同的rdbms产品实现检查约束的方式不同(有些根本没有),所以请查看rdbms关于检查约束的手册。
我更倾向于推荐基于trigger
的方法,而不是check constraint
。不能先使用check constraint
将值约束在40和60之间,然后使用default
值20。他们会互相冲突。使用trigger
,您可以实现所有这些检查并返回错误消息,这些消息将告诉用户insert
失败的原因
但是,您必须进行一些测试,看看触发器的性能是否处于可接受的水平。