跳到主要内容

CHECK约束

检查布尔表达式约束

  • @Check = `price >= 100` 检查价格大于等于100
  • @Check = `price > cost` 检查价格大于成本

示例

数据模型

hrm.salaries 工资表

CREATE TABLE salaries (
emp_no INT NOT NULL,
salary INT NOT NULL,
from_date DATE NOT NULL,
to_date DATE NOT NULL,
FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
PRIMARY KEY (emp_no, from_date)
)

给 hrm.salaries 工资表 to_date 字段添加如下注释

检查约束 @Check=`date(to_date) > date(from_date)` 结束日期大于开始日期

添加该注释的SQL

ALTER TABLE `hrm`.`salaries` CHANGE `to_date` 
`to_date` date NOT NULL COMMENT '检查约束 @Check=`date(to_date) > date(from_date)` 结束日期大于开始日期';

请求

POST http://127.0.0.1:21000
Content-Type: application/json;charset=utf-8
{
"jsonrpc": "2.0",
"method": "hrm.salaries.update",
"params": {
"empNo": 10010,
"salary": 92429,
"fromDate": "1996-11-24",
"toDate": "1996-10-10"
},
"id": "client-unique-request-id"
}

响应

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "validating data type: check constraint failed",
"data": {
"errorCode": "EU.Validator.DataTypeError",
"errorDetails": [
{
"constraint": "ExpressionReturnFalse",
"expression": "date(to_date) > date(from_date)",
"location": "hrm.salaries",
"message": "boolean expression `date(to_date) > date(from_date)` return false"
}
],
"errorMessage": "check constraint failed"
}
},
"id": "client-unique-request-id"
}

备注

上述配置可替代如下脚本

/* 检查 to_date > from_date */

/* 使用 dayjs 库来比较日期 */
const dayjs = require('dayjs');

/* 获取请求参数 */
const { data } = luwakVar.rpcArgs;

const fromDate = dayjs(data.fromDate);
const toDate = dayjs(data.toDate);

if (fromDate.isAfter(toDate)) {
luwak.returnError("DATE_RANGE_IS_INCORRECT", "开始日期必须小于结束日期")
}

如果定义了 Check Point,会优先执行 JavaScript。

可以禁用 PrePersist 和 PreUpdate。