CSV和ID问题

时间:2014-06-22 20:12:31

标签: php sql csv

我有一个包含员工的数据库。

由于我的雇主发现在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值。

我已经给了这个问题很多想法,我似乎无法找到简单的方法来实现这个目标。

任何帮助都将不胜感激。

注意:

  • 电子邮件不是唯一的,也不是必需的。
  • 唯一真正的唯一字段是ID字段。

9 个答案:

答案 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文件。这应该是所有员工的独特之处。