sql - SQL。如何检查插入的数据是否包含另一个表中正确组的值?
问题描述
如果有两个通用的类字典表。一种由类别组成,另一种由类别项组成。另外我有一个特定的表,它必须与适当类别的类别项目之一相关。这是示例:
类别表
id | title
-------------------
0 | payment type
1 | vehicle type
类别项目表
id | title | category_id
-----------------------------
0 | hourly | 0
1 | full time | 0
2 | motorcycle | 1
3 | bus | 1
员工表
id | name | payment_type
------------------------
0 | Mike | 1
1 | Josh | 0
2 | Anna | 1
所以我需要Employees表的列payment_type只能有来自Categories项目表的那些ID ,这些ID属于Categories表中的支付类型
我怎么能在 Postgres 中做到这一点?如果可能的话,我怎么能用 typeorm 做到这一点?
解决方案
对于这种情况,简单的约束是不够的。我认为您将不得不使用 afunction
和 a trigger
。看看@下面的文章:when-validation-is-not-enough-postgresql-triggers-for-data-integrity
我修改了示例,并制作了以下内容。
CREATE FUNCTION validate_payment_type() returns trigger as $$
DECLARE
categoryid int;
BEGIN
categoryid := (select id from categories c inner join categories_items ci on c.id = c.category_id
where NEW.payment_type = c.id);
-- categoryid with zero is payment
IF (categoryid != 0) THEN
RAISE EXCEPTION 'Attempting to insert payment_type that has a category item that is not payment_type';
END IF;
RETURN NEW;
END;
$$ language plpgsql;
CREATE TRIGGER validate_payment_type BEFORE INSERT OR UPDATE ON Employees
FOR EACH ROW EXECUTE PROCEDURE validate_payment_type();
注意:我没有在实时数据库上测试它,所以可能有一些错别字。
注意2:您可以从categoryId
to更改,categoryTitle
但您需要稍微更改查询,并使用varchar
if int 代替。
推荐阅读
- c# - 为什么我找不到添加到我的 Android 解决方案示例的图像?
- html - 表单字段不适合 Bootstrap 模式
- python-3.x - Python Flask 图像处理库
- groovy - 在 Groovy 中读取 \u0001 分隔文件
- aes - 使用没有身份验证标签的 Python 解密 AES GCM
- c# - 在 C# 控制台应用程序中生成文件路径时获取错误的文件路径
- swift - 调整已显示的 ViewController 的大小
- ansible - SCM 提交 ID/SHA 的 Ansible Tower 变量
- python-3.x - Python3在findall中使用带有正则表达式的f-string
- css - HTML iframe 在动画期间显示滚动条然后消失。CSS 溢出属性设置为隐藏