如果没有找到MySQL则插入

时间:2014-02-06 01:02:53

标签: mysql sql phpmyadmin

因为这可能是一个经典的“ON DUPLICATE KEY UPDATE”问题 - 它不是。

我有一个包含一些元值的表:

meta_id   |   user_id   |   meta_type   |   meta_value

实际上可以有更多具有相同user_id&& meta_type的条目,不能重复的是具有相同user_id&& {{1的条目}}&安培;&安培; meta_type。好吧,我可以为这些添加一个唯一的索引,但我害怕一件事 - meta_value是一个 longtext ,所以它可能包含更大的数据。
所以当我想创建唯一的密钥(那么我可以使用ON DUPLICATE KEY UPDATE)时,我收到一个错误:

meta_value

当我试图添加一些限制时,弹出:

#1170 - BLOB/TEXT column 'meta_hodnota' used in key specification without a key length

这对于可能进入来说太低了。所以问题是这个密钥是如何工作的:

  1. 这只是说 MySQL检查双重性列的部分时间,并且不会修改具有最大值的可能性。列值大小(max(longtext))
    注意:我只关心较小的条目,我不关心这个三重模式,我不关心大项目的双重性(不在这个地方)
  2. 正在削减拥有最大值的可能性。列值大小(max(longtext))并且只留下767bytes作为列的最大值,即使该列是longtext。 - 不可接受=>在这里额外的查询真的有必要吗?或者还有另一种方式吗? (例如,ssql-side搜索和变量save =>根据结果选择行动)
  3. 有关此问题的任何帮助/提示吗?

1 个答案:

答案 0 :(得分:1)

任何机会3072个字节就够了吗?在这种情况下,您可以在mysql配置中使用innodb_large_prefix参数。

如果3072字节不够,我会做的是添加一个固定的长度列(类似于varchar(256))并使用该列创建索引。插入/更新记录时,您可以使用SUBSTR()将长文本修剪为256个字符,并使用该值填充额外列。

这当然只有在你关心meta_ *中的较小条目时才有效。根据行数的不同,您的光盘使用量会略有增加,但在大多数情况下这不应该是一个问题。