我有一个名为contacts
的SQL表,其行数为n
,其中n大于10拉赫(100万)行。
下面是带有伪数据的表结构
+---------------+------------+---------+-----------+---------+------------------------+
| email | department | title | state | country | cleansing_verification |
+---------------+------------+---------+-----------+---------+------------------------+
| xyz@email.com | h.r. | sr. Exe | telangana | Ind | - |
+---------------+------------+---------+-----------+---------+------------------------+
所以,我有4个调度程序来清理上表中显示的数据,即
每个清洁程序将更新相应列的数据。我又添加了一个列调用cleansing_verification
,以标识哪个列已更新但无法正确使用。
任何清洁人员都可以触摸一封电子邮件。这意味着所有4个都可以更新值,或者任何3个,任何2个或只有1个。
所以,我面临的问题是如何识别被触摸的电子邮件,哪些未被识别,以便剩下的我可以发送电子邮件通知。
如果还有其他需要告诉我,我会在问题中补充。
谢谢。
答案 0 :(得分: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
如果要检查给定清洁程序更新了哪些行,请检查是否设置了该位,例如用于状态:
SELECT * FROM contacts WHERE cleansing_verification & B'0010' = B'0010'
实际上,这样做的正确方法是将一个带有外键的新表返回到contacts
表中,并为清洁剂添加一个列,例如(快速实例):
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