我有一个名为contacts
的SQL表,其中nn
行数超过100万(100万)行。
下面是包含虚拟数据的表格结构
+---------------+------------+---------+-----------+---------+------------------------+
| email | department | title | state | country | cleansing_verification |
+---------------+------------+---------+-----------+---------+------------------------+
| xyz@email.com | h.r. | sr. Exe | telangana | Ind | - |
+---------------+------------+---------+-----------+---------+------------------------+
因此,我有4个调度程序来清理上表中存在的数据,即
- 部门清洁剂
- 标题清洁剂
- 状态清洁剂
- 乡村洁面乳
每个清洁剂将更新相应列的数据。我又添加了一个列调用cleansing_verification
,以确定哪个列已更新但无法正确使用。
任何清洁剂都可以触摸一封电子邮件。这意味着所有 4 个都可以更新值或任何 3 或任意 2 或仅 1。
因此,我面临的问题是 如何识别哪些电子邮件被触摸,哪些没有被触摸,以便我可以发送电子邮件通知。
如果还有什么需要让我知道,我会补充这个问题。
提前谢谢。
所以通常我们不会在数据库设计领域这样做,但你可以使用位字段。因此,您的cleansing_verification
是BIT(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