C# 如何通过主键获取大量数据库表记录?

C# 如何通过主键获取大量数据库表记录?,c#,mysql,ado.net,select,primary-key,C#,Mysql,Ado.net,Select,Primary Key,使用ADO.NET MySQL连接器,通过主键获取大量记录(1000+)的好方法是什么 我有一个只有几个小列的表和一个VARCHAR(128)主键。目前它有大约10万条参赛作品,但这将在未来变得更多 起初,我想我应该使用SQL In语句: SELECT * FROM `table` WHERE `id` IN ('key1', 'key2', [...], 'key1000') 但是有了这个,查询可能会很长,而且我必须手动转义键中的引号字符等 现在,我使用一个MySQL内存表(tempidIN

使用ADO.NET MySQL连接器,通过主键获取大量记录(1000+)的好方法是什么

我有一个只有几个小列的表和一个VARCHAR(128)主键。目前它有大约10万条参赛作品,但这将在未来变得更多

起初,我想我应该使用SQL In语句:

SELECT * FROM `table` WHERE `id` IN ('key1', 'key2', [...], 'key1000')
但是有了这个,查询可能会很长,而且我必须手动转义键中的引号字符等

现在,我使用一个MySQL内存表(
tempid
INT,
id
VARCHAR(128))首先上传所有带有准备好的INSERT语句的密钥。然后我创建一个连接来选择所有现有的键,然后清理内存表中的混乱

有更好的方法吗

注意:好的,也许用字符串作为主键不是最好的主意,但是如果VARCHAR列是普通索引,问题也会一样


临时表:到目前为止,解决方案似乎是将数据放入临时表,然后加入,这基本上就是我目前所做的(见上文)。

如果主键遵循某种模式,您可以选择where键,如“abc%”

如果您希望以某种顺序一次输出1000,那么您可能希望在数据表中有另一个int列,该列具有聚集索引。这将与您当前的内存表做相同的工作-允许您按int范围进行选择


主键的性质是什么?有什么意义吗?

如果您的主键遵循某种模式,您可以选择像“abc%”这样的where键

如果您希望以某种顺序一次输出1000,那么您可能希望在数据表中有另一个int列,该列具有聚集索引。这将与您当前的内存表做相同的工作-允许您按int范围进行选择


主键的性质是什么?这有什么意义吗?

如果您关心性能,我绝对不会建议使用“IN”子句。如果可以的话,最好尝试进行内部连接


您可以先将所有值插入到临时表中并连接到该表,也可以进行子选择。最好的方法是实际分析这些变化,找出最适合您的方法。

如果您关心性能,我绝对不建议使用“IN”子句。如果可以的话,最好尝试进行内部连接


您可以先将所有值插入到临时表中并连接到该表,也可以进行子选择。最好的办法是实际改变这些变化,找出最适合你的东西。

为什么你不能考虑使用一个表值参数来以一个DATABATE的形式来推键,并取出匹配的记录?< /P> 或

只需编写一个私有方法,该方法可以连接所提供集合中的所有密钥代码,并返回单个字符串并将该字符串传递给查询


我认为它可以解决你的问题。

为什么你不能考虑使用表值参数来以DATABATE的形式来推键,并提取匹配的记录? 或

只需编写一个私有方法,该方法可以连接所提供集合中的所有密钥代码,并返回单个字符串并将该字符串传递给查询


我认为这可能会解决您的问题。

我曾在工资系统中处理过类似的情况,用户需要根据选定的员工(例如员工
X,Y,Z…
或在某些办公室工作的员工)生成报告。我已经构建了一个包含所有员工和所有可被视为筛选条件的属性的筛选窗口,并让该窗口将所选员工id保存在数据库的筛选表中。我这样做是因为:

  • 在过滤器中使用动态生成的
    生成
    SELECT
    查询非常难看而且非常不实用
  • 我可以在需要使用过滤器窗口的所有查询中加入该表

  • 可能不是最好的解决方案,但它已经提供了,而且仍然为我提供了很好的服务。

    我曾经在工资系统中处理过类似的情况,用户需要根据选择的员工(例如员工
    X,Y,Z…
    或在某些办公室工作的员工)生成报告。我已经构建了一个包含所有员工和所有可被视为筛选条件的属性的筛选窗口,并让该窗口将所选员工id保存在数据库的筛选表中。我这样做是因为:

  • 过滤器中使用动态生成的
    生成
    SELECT
    查询非常难看而且非常不实用
  • 我可以在需要使用过滤器窗口的所有查询中加入该表

  • 可能不是最好的解决方案,但已经提供了,而且仍然很好地为我服务。

    您如何获得查询的密钥列表?现在重新考虑您的主键是否为时已晚-VARCHAR(128)不是任何想象中的首选选项,特别是如果你说非键列很小,为什么你要选择一大块明显不相关的记录?与其说选择给定列具有特定值或在给定范围内的所有记录,不如说选择键是唯一的电子邮件ID,因此它们可以是任何内容,我必须处理邮件服务器生成的任何内容。所以,不幸的是,我不得不使用字符键。问题来自于同步:检查数据库中是否已经存在现有的邮件ID。in(long,long,long,list,of,items)策略工作得很好,而且非常有效,对于我来说,在mySQL中有几千个项目,在我的例子中是邮政编码文本字符串。FWIW,在Oracle中限制为1000项。如果在内存中使用临时表,如果一次有多个用户执行此操作(php类型的应用程序服务器连接),请小心保持表名的笔直