从员工表自动填充门禁交易SQL表字段,是否应使用SQL视图?
问题解答:是否用SQL视图自动填充门禁交易表的员工姓名?
结论:不建议用视图来“填充”table2的物理字段——视图是虚拟表,不会把姓名实际写入table2,它只是实时关联两张表的查询结果。下面给你两种对应需求的可行方案:
方案1:用触发器自动填充(适合需要物理存储姓名的场景)
如果必须让table2里实实在在存着FirstName和LastName,那可以给table2加个插入触发器:每次有新记录插入时,自动从table1里匹配对应EmployeeID的姓名,写入table2的对应字段。
举个MySQL的示例代码:
DELIMITER // CREATE TRIGGER fill_employee_names AFTER INSERT ON table2 FOR EACH ROW BEGIN UPDATE table2 SET FirstName = (SELECT FirstName FROM table1 WHERE EmployeeID = NEW.EmployeeID), LastName = (SELECT LastName FROM table1 WHERE EmployeeID = NEW.EmployeeID) WHERE `Time/date` = NEW.`Time/date` AND EmployeeID = NEW.EmployeeID; END // DELIMITER ;
注:不同数据库的触发器语法有差异,比如SQL Server、PostgreSQL写法不同,需要根据你用的数据库调整。
方案2:创建视图替代物理存储(适合仅查询时需要姓名的场景)
如果不需要把姓名存在table2里,只是查门禁记录时要显示员工姓名,直接建个关联视图就行。这样既省存储空间,还能保证姓名始终和table1同步(避免table1里员工姓名更新后,table2的旧数据过时)。
示例SQL代码:
CREATE VIEW vw_access_records AS SELECT t2.`Time/date`, t2.EmployeeID, t1.FirstName, t1.LastName FROM table2 t2 JOIN table1 t1 ON t2.EmployeeID = t1.EmployeeID;
之后查这个视图vw_access_records,就能直接拿到带姓名的完整门禁记录,不用动table2的结构和数据。
总结
- 要物理存储姓名:用触发器;
- 仅查询时需要姓名:优先用视图,更高效且数据不会不一致。
内容的提问来源于stack exchange,提问作者Paul Hanna
相关产品推荐
相关产品推荐

