首页 > 解决方案 > 识别 SQL 列更新的业务逻辑

问题描述

我有一个称为行数的 SQL 表contactsn其中 n 超过 10Lakh(100 万)行。

下面是带有虚拟数据的表结构

+---------------+------------+---------+-----------+---------+------------------------+
|     email     | department |  title  |   state   | country | cleansing_verification |
+---------------+------------+---------+-----------+---------+------------------------+
| xyz@email.com | h.r.       | sr. Exe | telangana | Ind     |                      - |
+---------------+------------+---------+-----------+---------+------------------------+

所以,我有 4 个调度程序来清理上表中存在的数据,即

  1. 部门清洁剂
  2. 标题清洁剂
  3. 状态清洁剂
  4. 乡村清洁剂

每个清洁器都会更新相应列的数据。我又添加了一个列调用cleansing_verification来确定哪一列已更新但无法正确使用。

任何清洁剂都可以触及一封电子邮件。这意味着所有 4 都可以更新值或任何 3 或任何 2 或仅 1。

所以,我面临的问题是如何识别哪些电子邮件被触及,哪些未被触及,以便我可以发送电子邮件通知。

如果有更多需要让我知道,我会在问题中添加。

提前致谢。

标签: sqlpython-3.xpostgresql

解决方案


所以通常我们不会在数据库设计领域这样做,但您可以使用位域。所以你cleansing_verification是一个BIT(4)类型列,每个清洁剂都有一些他们可以设置的:

  • 部门 =B'1000'
  • 标题=B'0100'
  • 状态 =B'0010'
  • 国家 =B'0001'

当运行 ie state 时,你会:

UPDATE contacts 
   SET cleansing_verification = cleansing_verification | B'0010'
 WHERE -- whatever conditions you want to apply

如果您想检查给定清理程序更新了哪些行,请检查该位是否已设置,例如状态:

SELECT * FROM contacts WHERE cleansing_verification & B'0010' = B'0010'

dbfiddle 上的工作示例

实际上正确的方法是引入一个带有外键的新contacts表和一个用于清洁器的列,例如(quick'n'dirty example):

CREATE TABLE contacts_verification
(
   contact_id int references contacts(id),
   cleanser int
)

然后,如果您想标记一条记录,您只需插入联系人 ID 和某种清洁剂标识(1、2、3、4),或者如果您真的需要,您可以使用文本字段和有意义的名称:

INSERT INTO contacts_verification (contact_id, cleanser) VALUES (21386, 1)

然后只需使用JOIN来取回由清洁器标记的记录:

SELECT c.*
  FORM contacts c
  JOIN contacts_verification dep_verify
    ON dep_verify.contact_id = c.id
   AND dep_verify.cleanser = 1

推荐阅读