首页 > 解决方案 > 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 做到这一点?

标签: sqlpostgresqlddltypeorm

解决方案


对于这种情况,简单的约束是不够的。我认为您将不得不使用 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:您可以从categoryIdto更改,categoryTitle但您需要稍微更改查询,并使用varcharif int 代替。


推荐阅读