提问者:小点点

CSV和ID问题


我有一个员工数据库。

由于我的雇主发现在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文件本身的一部分
它们是自动增量值。

我对这个问题想了很多,似乎找不到一个简单的方法来完成这个问题。

任何帮助都将不胜感激。

笔记:

  • 电子邮件不是唯一的,也不是必需的

共3个答案

匿名用户

解决方案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可能是空字符串)。然后可以删除临时表。

如果你想成为偏执狂,你可以仔细检查姓名或电子邮件,如果发现不匹配,则在不更新的情况下标记它们。如果有人更改了他们的姓名,这将导致手动操作,但如果有人弄乱了你的身份证号码,这也将为你省去麻烦。