如何使用UNIX时间戳将列数据重命名为唯一字符串以在列上添加唯一约束?

时间:2018-07-31 16:29:59

标签: sql unique

我有像这样的表结构 用户表
id |名称
1 |约翰
2 |山姆
3 |约翰
4 |山姆
5 |约翰

现在我想在表的名称列上添加唯一键约束,并通过附加时间戳来更新这些值,因此我的输出应类似于

id |名称
1 |约翰
2 |山姆
3 |约翰1533051839
4 | Sam1533051840
5 | John1533051841

我正在尝试使用临时表吗?我能做到吗? 我正在尝试以下解决方案

drop table if exists temp_user;

create table temp_user(id int(20), name varchar(128));

insert into temp_user
  select id, name
  from user
  group by user.name;


update user u
  inner join temp_user temp_u ON temp_u.id = u.id
  SET u.name = CONCAT(u.name, UNIX_TIMESTAMP());


drop table temp_user;

1 个答案:

答案 0 :(得分:0)

如果我了解您想要的内容,则需要为Name添加时间戳以使其唯一。也许这不能完全回答您的问题,但我有一个提示。为此,您应该使用触发器而不是创建索引或编写更复杂的查询,其优点如下:

  1. 索引很难维护,因此,只有在频繁查询或显着减少表基数的where子句中涉及到索引属性时,才应考虑使用索引。
  2. 如果您必须编写一个更复杂的查询,可能无法在其他应用程序中使用,则假设您有一个带有表单的Web应用程序,用户可能要插入其姓名而不是时间戳。

很明显,触发器语法取决于您的dbms,但举例说明您可以在Oracle中执行的操作:

 create or replace trigger updateName
 after insert on user_table

 declare
 number_of_user int;

 begin

 select count(*) into number_of_user
 where Name = :NEW.Name;

 if(number_of_user <> 0) then
    :NEW.Name = CONCAT(:NEW.Name, UNIX_TIMESTAMP());
 end if;
 end;