返回
MySQL LEFT JOIN 巧用空连接,巧妙记录 RFID 工作时间
mysql
2024-03-17 06:08:26
MySQL 中使用 INSERT 和空连接
问题
需要使用 MySQL 数据库记录通过连接到 Raspberry Pi 的 RFID 读卡器注册的工作时间。问题在于,个人姓名不会直接与 RFID 卡的 key_id
关联,因此无法在不丢失过去记录的情况下重新使用 RFID 卡。
解决方法
使用 LEFT JOIN 查询可以解决这个问题。LEFT JOIN 查询将从 Connection
表中检索所有行,无论 key_id
是否匹配。然后,它将这些行与 Registration
表连接起来,并为没有匹配项的行返回 NULL 值。
修改后的查询
INSERT INTO Registration (key_id, User_Id, TimbraData, TimbraStato, TimbraHH)
SELECT
'XXXXXXXX',
Connection.User_Id,
'2024-03-19',
'E',
'18.40'
FROM Connection
LEFT JOIN Registration
ON Connection.key_id = Registration.key_id
WHERE
Registration.key_id IS NULL;
解释
LEFT JOIN
将检索Connection
表中的所有行,无论key_id
是否匹配。Registration.key_id IS NULL
条件确保仅选择没有匹配项的行。- 对于没有匹配项的行,
User_Id
将被设置为 NULL。
其他注意事项
- 还可以通过在
Connection
表中创建一个新列来存储User_Id
,即使key_id
丢失,也可以跟踪User_Id
。 - 应该考虑使用触发器或存储过程来处理新卡的分配和记录插入。
常见问题解答
- 为什么使用 LEFT JOIN 而不是 JOIN?
JOIN 将仅返回具有匹配key_id
的行,而 LEFT JOIN 将返回所有行,包括key_id
匹配的和不匹配的。 - 为什么需要设置
User_Id
为 NULL?
当没有匹配项时,需要设置User_Id
为 NULL,以便在Registration
表中记录新卡。 - 如何处理没有
key_id
的新卡?
在插入Registration
表之前,新卡需要分配一个key_id
。这可以通过使用触发器或存储过程来完成。 - 如何更新
Registration
表中的记录?
可以使用 UPDATE 查询来更新Registration
表中的记录。 - 如何删除
Registration
表中的记录?
可以使用 DELETE 查询来删除Registration
表中的记录。