合并具有一个不同值

时间:2015-04-27 14:57:46

标签: mysql

这是对this question的更正,现在我正确理解了我需要做什么。

在MySQL中,我有一张电影表及其显示的日期以及其他栏目中的其他信息。

所以相关专栏是......

FilmID

FilmName

DateShown

日期存储为Unix时间戳。

我目前有多个电影实例在不同日期显示,但所有其他信息都是相同的。

我需要将复制影片的日期复制到与影片ID匹配的新表格中。然后我需要从原始表中删除重复的电影行。

所以我创建了一个新表,Film_Dates包含列

FilmDateID
FilmID
Date 

任何人都可以帮助实际的sql来做到这一点。

谢谢。

1 个答案:

答案 0 :(得分:1)

开始于:

insert into filmdateid (filmid, `date`)
  select filmid, dateshown 
    from films

这应填充新表。

alter ignore table films
  add unique (filmid)

这将强制执行filmid的唯一性,并删除所有重复项,只保留一行。如果此操作因重复条目失败而失败。错误,您需要运行此命令,然后再次尝试更改。

set session old_alter_table=1

因为看起来mysql正在逐渐远离能够这样做。

最后,您需要摆脱datehown列。

alter table films
  drop column dateshown

在尝试任何此操作之前,请确保您有备份。总是最安全。

因为filmid没有重复,只有filmname,还有一些额外的步骤

首先,创建filmdates表:

create table filmdates as
  select filmname, dateshown
    from films;

然后添加一个filmid列:

alter table filmdates add column filmid integer;

(filmname, dateshown)

上的唯一索引
alter ignore table filmdates add unique(filmname, dateshown);

然后我们在films(filmname)上添加一个唯一索引 - 因为它是真正重复的唯一值。

alter ignore table films add unique(filmname);

现在我们正在设置,我们在新表格中填充filmid列,并使用旧版本的加工值。

update films f 
  inner join filmdates fd
    on f.filmname = fd.filmname
  set fd.filmid = f.filmid;

现在我们只需要清理并删除冗余列(films.dateshownfilmdates.filmname)。

alter table filmdates drop column filmname;
alter table films drop column dateshown;

demo here