我有一个员工数据库。
由于我的雇主发现在CSV文件中输入数据很容易,所以我编写了一个程序来截断我的数据库并将CSV数据插入我的数据库。
Employee: [ID, LAST_NAME, NAME, EMAIL, REMARKS, ...]
我使用字段ID(这是一个自动增量值)使我的员工的所有字段都是唯一的。这很好,但是最近我的雇主也要求我加入一个标记收藏夹的功能。
唯一让我的员工独一无二的是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文件本身的一部分
它们是自动增量值。
我对这个问题想了很多,似乎找不到一个简单的方法来完成这个问题。
任何帮助都将不胜感激。
笔记:
解决方案1(最简单)
在数据库中有一个int
是您最喜欢的
列,该列包含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文件时,根据收藏
列,只需在数据库中设置相同的值。这将消除不匹配收藏夹的问题。不幸的是,如果在近功能中,客户端需要依赖于收藏夹的新功能,那么您可能会再次遇到同样的问题。
解决方案2(最佳)
与您的客户讨论一个更成熟的解决方案,指出当前的CSV解决方案不再是一个有效的选项,因为CSV用户与相应的子功能(即收藏夹)相匹配的问题
一个可能的解决方案是永远不要截断表。曾经找出员工的独特之处。例如,电子邮件
。
然后,当您解析下一个CSV时,您不会简单地插入员工。您可以更新当前文件并插入新文件。
这样,您的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。哪一个可以做得不同(从这里):
INSERT INTO subs
(subs_name, subs_email, subs_birthday)
VALUES
(?, ?, ?)
ON DUPLICATE KEY UPDATE
subs_name = VALUES(subs_name),
subs_birthday = VALUES(subs_birthday)
我不会截断这张桌子。然后我将csv上传到一个临时表中。如果两个表中的ID相同,则执行更新。如果它仅在旧版本中,请将其删除(删除该ID的收藏夹),或者,最好在employees表上设置一个停用该行的标志。如果仅在新版本中,则插入除ID之外的所有内容(ID可能是空字符串)。然后可以删除临时表。
如果你想成为偏执狂,你可以仔细检查姓名或电子邮件,如果发现不匹配,则在不更新的情况下标记它们。如果有人更改了他们的姓名,这将导致手动操作,但如果有人弄乱了你的身份证号码,这也将为你省去麻烦。