加入不同类型的列?

Posted

技术标签:

【中文标题】加入不同类型的列?【英文标题】:Joining on columns of different type? 【发布时间】:2009-08-07 03:21:41 【问题描述】:

如果一列是 int 类型并说其值为 10。另一列是 varchar 类型且值为 '10'。加入这些值 (mysql) 是否安全,我会得到与 int 类型和值 10 相同的结果吗?

我需要有不同类型的它们,因为在一个表中,列是一个自动递增键(所以它必须是 int)。另一列(在不同的表中)有时可能包含带有字母的值,因此我必须将其设为 varchar。你能预见到这有什么大问题吗?或者我应该重新考虑我的架构?

【问题讨论】:

【参考方案1】:

这种方法有两个问题:

    MySQL 不会在此类连接中使用索引 - 根据您的情况(表大小/查询/等),这可能会或可能不会是一个大问题

    在数据库设计方面,这闻起来很腥。也许这是我可怜的想象力:-) 但我想不出这样的例子是合理的。如果它是一个表中的主键,它应该是另一个表中的外键。你能更详细地解释一下你想要做什么吗?

【讨论】:

我认为我的方法有缺陷。我想通过将列用作另一个表的索引和会话 id 来保存其中一个表中的列(业务逻辑规定,有时表或对象需要对另一个表的引用,有时它需要字母数字会话 ID)。但我想更好的做法是为会话 id 创建另一个类型为 varchar 的列并允许空值。 绝对是。具有不同含义的值几乎总是属于不同的列(有例外,但这不是其中之一)【参考方案2】:

只要您明确地转换数据以使比较最终以等效的数据类型完成,您应该没问题。

根据您的描述,您需要在进行比较之前将 int 数据类型转换为 varchar。如果在您的数据库上设置了大写,请注意修剪空白并注意。还有 - int 比较比 varchar 比较快。

【讨论】:

你错了。转换,无论是显式的还是隐式的,都无济于事 - 索引仍然不会用于连接:dev.mysql.com/doc/refman/6.0/en/mysql-indexes.html。更不用说没有任何理由像这样对数据库进行建模。 我在关于索引的问题中没有看到任何内容......我试图回答操作员关于结果集的问题。是的,他可以通过进行显式转换来进行比较来获得正确的结果集。我想我的回答是关于你心中没有张贴或陈述的问题是错误的,但这些问题很难回答。操作人员需要按照他描述的方式设计系统可能是有原因的。我同意这不是最佳解决方案,但没有足够的关于问题域的信息来做出判断。 另外,你的回答也是错误的,因为我心中的问题是生命的意义是什么...... OP 的问题是——我引用了——“你能预见这有什么大问题吗?”。您是否同意不能对他清楚描述他将要加入的内容使用索引(我再次引用:“加入这些值是否安全”)可能是大问题?顺便说一句,在这种情况下不需要显式转换,也没有理由以这种方式设计数据库,但这不是我要争论的重点。你是说使用显式转换他会很好 - 这就是我不同意的。 大声笑 - 原谅我,我不像你那样通灵 - 你知道加入将是一个非常大的集合,没有操作说明这样(它可能只是几千行...... )。

以上是关于加入不同类型的列?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫加入具有不同名称的列[重复]

循环并为不同类型的包制作不同的列

PySpark DataFrames - 使用不同类型的列之间的比较进行过滤

如何访问数组类型值并在两个不同的列中设置火花?

对具有不同类型的列使用动态反透视

JPA 或 Hibernate - 在不同类型的列上连接表