【问题标题】:What's the most efficient way of truncating the names in a first_name and last_name column to 1 character?将 first_name 和 last_name 列中的名称截断为 1 个字符的最有效方法是什么?
【发布时间】:2020-06-22 17:55:32
【问题描述】:

将 first_name 和 last_name 列中的名称截断为 1 个字符的最有效方法是什么?

我有一个 mysql 数据库,我想将它交给开发人员,但我想对数据进行部分清理,以便两个名称记录下降到只是首字母。

我尝试将 varchar 修改为 1 个字符,但 mysql 不会让我截断数据,它只会引发错误。在我交出它之前,我正在从数据库的转储中工作。我想隐藏名称而不使它们都相同。

【问题讨论】:

  • 分块更新以减少事务大小。每次更新可能有 10000 - 100000 行。

标签: mysql sql sanitization anonymize


【解决方案1】:
update tablename set first_name=left(first_name, 1), last_name = left(last_name, 1)

但是,正如 Gordon Linoff 所说,如果表中有很多行,这可能会很昂贵

【讨论】:

  • 我喜欢这个答案,它有效,但我一直收到此错误ERROR 1048 (23000): Column 'user_id' cannot be null 但我根本不明白,因为我们没有在查询中编辑 user_id,最奇怪的是当我再次显示记录时,它为一组记录正确执行。你以前见过这样的事情吗?
  • 为了让这更奇怪,我运行了大约 20 次查询,并且在某个时候它完成了所有其余的工作而没有抱怨。我不知道那是什么。
  • @Tenthrow 不知道你为什么会收到这个错误
  • 它看起来像是由触发器引起的,但我没有设计这个数据库,所以我不知道它在那里。去搞清楚。你的查询效果很好!谢谢!
  • @Tenthrow 是的,我实际上正要评论它看起来可能是由约束或触发器引起的
【解决方案2】:

由于需要日志记录,更新所有行的成本相当高。最有效的方法可能是创建一个新表:

create table for_developer as
    select left(first_name, 1) as first_name, left(last_name, 1) as last_name,
           . . . -- rest of columns
    from t;

【讨论】:

  • 我可以这样替换原来的表吗?我需要结果与生产数据库具有相同的结构。
  • @Tenthrow 。 . .只需列出其余列。
【解决方案3】:

你为什么不试试:

Update "you_table"
SET first_name = LEFT(first_name,1), 
last_name = LEFT(last_name,1);

【讨论】:

    【解决方案4】:

    您可以在创建新表时使用like,以便拥有与旧表相同的列属性和定义。不过,请务必在创建表时检查manual like 的行为,尤其是在您担心索引时。

    create table new_table like old_table;
    
    insert into new_table
    
    select left(first_name, 1) as first_name, left(last_name, 1) as last_name, ..-- rest of columns
    from old_table;
    

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2012-04-29
      • 2018-07-10
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2012-03-07
      • 2013-03-09
      相关资源
      最近更新 更多