跳到主要内容

取值范围

Luwak中,取值范围的验证是通过CHECK约束实现的。CHECK是SQL92规范里的功能。MySQL 8.0.16 支持了CHECK。

CHECK 约束用于限制表中数据的有效性,确保数据符合指定条件或规则。通过使用 CHECK约束,可以在数据库级别强制实施数据完整性和业务规则,以确保数据库中的数据符合规定的条件和要求。这有助于维护数据质量和安全性,减少错误数据的插入,并加强数据库的可靠性。

应用场景

  • 数据范围限制

    确保数值字段的值在特定范围内,如要求销售价格必须大于零,或者年龄必须在一定范围内。

  • 日期范围限制

    限制日期字段的有效性,如确保生日在有效日期范围内,或确保合同起始和结束日期的逻辑正确性。

  • 枚举值

    限制字段的值只能是预定义的枚举值之一,如性别只能是 "男" 或 "女",或状态只能是 "激活"、"暂停" 或 "注销"。

  • 复杂条件

    执行复杂的逻辑条件,例如确保订单的交付日期在订单创建日期之后,或确保手机号码符合特定格式。

  • 数据完整性

    用于确保数据的完整性,如确保在订单表中存在有效的客户ID,或确保员工表中的主管ID引用有效的员工。

  • 业务规则

    实施与特定业务需求相关的规则,如确保退货的数量不大于库存数量,或确保新闻文章的发布日期在当前日期之前。

  • 安全性约束

    用于安全目的,以确保只有授权用户能够访问特定数据。例如,只允许特定用户类型(例如管理员)访问某些敏感数据。

  • 用户权限控制

    在多用户环境中,可以使用 CHECK 约束来限制用户对特定数据的访问权限,以确保用户只能访问其被授权的数据。

示例

现有员工数据表,salary字段记录员工工资,该字段需要校验值必须大于1000

CREATE TABLE employees (
emp_no INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
hire_date DATE,
salary DECIMAL(10, 2),
CHECK (salary > 1000)
);

现在新增一条数据,salary小于1000

luwak请求报文

JSON-RPC请求报文

{
"jsonrpc":"2.0",
"method":"hrm.employees.add",
"params": [
{
"empNo": 10008,
"birthDate": "1964-06-02",
"firstName": "Thomas",
"lastName": "Simmel",
"gender":"F",
"hireDate":"1985-11-21",
"salary":999
}
],
"id":"client-unique-request-id"
}

响应报文

{
"jsonrpc": "2.0",
"error": {
"code": 10000,
"message": "error create: salary: 999 does not validate as numeric",
"data": "EU.Z.Query"
},
"id": "client-unique-request-id"
}

Luwak给出错误信息salary校验不通过,拒绝写入数据库。