mysql - 存储分隔列表的数据类型

标签 mysql

我想像这样存储字符串

"1,5,6,7,9,45,20,45,78,81..."

  • 数字不能为负数或小数,并且可以在 0-+-200 之间变化
  • 数字之间用','分隔
  • 列表最多可以包含 0-150 个项目。

我应该为保存这些字符串的列使用什么数据类型?

最佳答案

您要存储的内容称为非规范化数据。 MySQL 有一些专门用于处理此问题的功能,但最好的方法是每行存储一个值,例如:

id  |  value
---------------
1   |  1
1   |  5
1   |  6
1   |  7

..等等。因为逗号分隔列表:

  1. 很难在其中寻找特定的值
  2. 可以使用 MySQL's GROUP_CONCAT function 生成:

      SELECT t.id, 
             GROUP_CONCAT(t.value)
        FROM TABLE
    GROUP BY t.id
    

这是我推荐的表设置的 CREATE TABLE 语句:

DROP TABLE IF EXISTS `example`.`list_values`;
CREATE TABLE  `example`.`list_values` (
  `id` int(10) unsigned NOT NULL default '0',
  `val` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`,`val`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

作为两列的主键确保您不能为一个集合设置重复项 - 如果您要存储的数据不是这样,请将其删除。

列表最多可以包含 0-150 个项目。

您需要使用 a trigger执行该业务规则。

关于mysql - 存储分隔列表的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3364578/

相关文章:

php - 如何限制用户在 24 小时内可以给的票数?

mysql - 导出我的分析数据并将其放入数据库中

MYSQL 加速查询

mysql - 删除列中除前 7 个值之外的值

php - 如何从一个表中获取变量并将其插入到另一个表中

PHP 编码(猜测 UTF-8)

mysql - 如何组合 select 语句,每个语句在不同的列中

mysql - 修复损坏的表时出现错误 "is not BASE TABLE"

mysql - NHibernate 数据库创建后如何将固定数据插入数据库?

php - 将 2 个 select 语句组合到一个查询中