我有一个包含员工的数据库。
由于我的雇主发现在CSV文件中输入数据很容易,我写了一个截断我的数据库并在我的数据库中插入CSV数据的程序。
Employee: [ID, LAST_NAME, NAME, EMAIL, REMARKS, ...]
我使用字段ID(这是一个auto_increment值)来使我的所有员工都是唯一的。这很好用,但是最近我的雇主也要求我提供标记收藏夹的功能。
唯一让我的员工与众不同的是ID键,因此我更新时 由于我不得不截断我的数据库并且收藏夹不再匹配,因此新的CSV文件ID已全部中断并被移动。
我的意思的一个例子(CSV文件):
0, Carlton, John, john@gmail.com, "Great worker",
1, Awsome, Dude, awsomeDud@aol.com, "Not so great",
2, Random, Randy, rr@hotmail.com, "idk"
假设某人删除了ID为1的记录
而我最喜欢的是1,csv文件现在看起来像这样:
0, Carlton, John, john@gmail.com, "Great worker",
1, Random, Randy, rr@hotmail.com, "idk"
指向错误的人 请记住,我写的ID不是csv文件本身的一部分 它们是auto_increment值。
我已经给了这个问题很多想法,我似乎无法找到简单的方法来实现这个目标。
任何帮助都将不胜感激。
注意:
答案 0 :(得分:1)
解决方案1 (最简单)
数据库中的int
is_favorite
列包含1或0,默认值为0
(意思不是最喜欢的)。然后让您的客户稍微更改csv文件的格式,如下所示:
Employee: [ID, LAST_NAME, NAME, EMAIL, REMARKS, FAVORITE, ...]
示例CSV:
0, Carlton, John, john@gmail.com, "Great worker", 1
1, Awsome, Dude, awsomeDud@aol.com, "Not so great", 0
2, Random, Randy, rr@hotmail.com, "idk"
处理CSV文件时,根据FAVORITE
列,只需在数据库中设置相同的值即可。这将消除不匹配的收藏夹的问题。不幸的是,如果在近似功能中,客户端需要依赖于收藏夹的新功能,您可能会再次遇到相同的问题。
解决方案2 (最佳)
与客户讨论更成熟的解决方案,指出当前的CSV解决方案不再是有效选项,因为将CSV用户与相应的子功能(即收藏)匹配会出现问题
答案 1 :(得分:0)
一种可能的解决方案是永远不要截断你的表。永远。
了解员工的独特之处。例如。 EMAIL
。
然后,当您解析下一个CSV时,您不仅仅是INSERT
员工。您更新当前的并插入新的。
这样,您的ID始终保持不变(他们应该这样)。 我会用这样的东西:
IF EXISTS (SELECT 1 FROM [User] WHERE [Email] = @UsersEmail)
BEGIN
UPDATE [User]
SET [Name] = @NewName
WHERE [Email] = @UsersEmail
END
ELSE
BEGIN
INSERT INTO [User] ([Email], [Name]) VALUES
(@UsersEmail, @NewName)
END
但是既然你已经将它标记为PHP,我就猜测你正在使用MySQL。哪个可以采用不同的方式(from here):
INSERT INTO subs
(subs_name, subs_email, subs_birthday)
VALUES
(?, ?, ?)
ON DUPLICATE KEY UPDATE
subs_name = VALUES(subs_name),
subs_birthday = VALUES(subs_birthday)
答案 2 :(得分:0)
我不会截断表格。然后我会将csv上传到临时表中。如果两个表中都有相同的ID,请执行更新。如果它只是在旧版本中,删除它(删除收藏夹以及该ID),或者更好的是,在employees表上有一个停用该行的标志。如果只是在新版本中,请插入除ID之外的所有内容(无论如何都可能是空字符串)。然后你可以删除临时表。
如果您想要偏执,可以仔细检查姓名或电子邮件,如果发现不匹配,请标记它们而不进行更新。如果有人更改了他们的名字,这将导致手动操作,但如果有人搞砸了您的身份证号码,也可以省去麻烦。
答案 3 :(得分:0)
解决此问题的简单和 clean 方法是找到一种方法来识别平面数据上的独特员工。
是否没有其他唯一标识符可以添加到csv文件中?例如,Windows登录名?公司员工不?一些不稳定的东西。
这样很简单:
1,不要截断。
2,如果Windows LoginID / EmpNo存在,请更新。
3,如果没有,请添加。
此外,我担心您的“收藏夹”表明显没有使用参照完整性。它应该有一个FK指向你的Employee.ID;防止您意外删除标记为收藏的员工等。
更简洁,更不用说防弹方式,就是根据您的员工姓名而不是ID来标记您的收藏夹。这种方法有明显的缺点,因此请尽量使用。
答案 4 :(得分:0)
由于您在问题中描述的原因,您不应该使用ID
来识别给定用户。
您可以根据已有的字段创建新的reference ID
字段,并通过将所需字段链接为单个字符串然后计算MD5哈希值来创建唯一标识符。
我有一个问题(抱歉,我无法评论 - 代表):您的雇主仅通过CSV文件添加新员工,甚至编辑现有员工?
如果只添加新员工,则不需要从头开始重建表,并且可以确保程序在将数据插入数据库之前生成唯一的reference ID
(将保持不变) 。此外,您的程序可以处理员工的编辑,而不是从CSV更改数据,而reference ID
保持不变。
通过这种方式,可以编辑名称,电子邮件等所有字段,并且指向收藏夹的链接将保持正确。在这种情况下,reference ID
也可以不仅使用CSV上的数据计算,还可以使用创建时间戳等其他数据计算。
答案 5 :(得分:0)
您可以从名称,电子邮件和评论创建MD5哈希,保存并将其用作唯一标识符。
确保将MD5哈希存储为二进制
答案 6 :(得分:0)
你能修改数据库吗?如果可以,请添加另一个可以调用收藏夹的字段。将其设置为简单枚举(1,0)并将1设置为收藏夹,将0设置为其他设置。因此,当您截断数据库时,您仍将按这些字段获取收藏夹。当然,如果您有多级收藏夹,请不要将字段设置为枚举,将其设置为其他更适合您的地方。
答案 7 :(得分:0)
一个解决方案是数据库成为ID的事实“来源”。
初次导入后,下次你的老板想要更新文件时,创建一个CSV FROM 数据库(ID完好无损)并让老板更新并返回。< / p>
您可以要求他在文件底部添加新行,并省略ID。
新电子表格中没有ID的任何行都是新记录。老板可以使用该行末尾的额外字段来指示要删除的行。
下次老板想要更新文件时重复此过程。
答案 8 :(得分:0)
在数据库表中添加一个额外的字段,以及名为&#34; EmployeeID
&#34;的CSV文件。这应该是所有员工的独特之处。