用于标识 SQL 列更新的业务逻辑



我有一个名为contacts的SQL表,其中nn行数超过100万(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。

因此,我面临的问题是 如何识别哪些电子邮件被触摸,哪些没有被触摸,以便我可以发送电子邮件通知。

如果还有什么需要让我知道,我会补充这个问题。

提前谢谢。

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

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

当运行即状态时,您将:

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

如果要检查给定清理器更新了哪些行,请检查该位是否已设置,例如 for state:

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

关于 dbfiddle 的工作示例

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

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

最新更新