【问题标题】:SQL. How to check if inserted data contains value of correct group from another table?SQL。如何检查插入的数据是否包含另一个表中正确组的值?
【发布时间】:2020-02-06 02:35:45
【问题描述】:

如果有两个通用的类字典表。一种由类别组成,另一种由类别项组成。另外我有一个特定的表,它必须与适当类别的类别项目之一相关。示例如下:

分类表

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 items 表中的那些 ids属于类别表中的支付类型

我如何在 Postgres 中做到这一点?如果可能的话,我怎么能用 typeorm 做到这一点?

【问题讨论】:

  • 这是您拥有并且可以修改的架构吗?简单的答案是为每个域创建单独的父查找表,而不是制作单个通用查找表。在此示例中,您最终会得到 payment_typevehicle_type 作为单独的表,每个表有两行。
  • 是的,这实际上是我的宠物项目。但为什么我最终会得到单独的表格?我用触发器实现了它,效果很好
  • A previous question 进行了一些很好的讨论。特别是,它引用了this article,它将单一查找列为模型中要避免的第一个反模式。

标签: sql postgresql ddl typeorm


【解决方案1】:

对于这种情况,简单的约束是不够的。我认为您将不得不使用functiontrigger。看看@下面的文章: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 更改为categoryTitle,但您需要稍微更改查询,并使用varchar 代替int。

【讨论】:

  • 谢谢!你的回答真的很有帮助,我实现了触发器。顺便问一下,您认为数据库设计的好方法是什么?
猜你喜欢
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2023-03-24
  • 2020-11-18
  • 2014-01-16
相关资源
最近更新 更多