这是对 this question 的更正现在我正确地理解了我需要做什么。
我在 MySQL 中有一个表格,其中包含电影及其放映日期以及其他列中的其他信息。
所以相关列是...
FilmID
FilmName
DateShown
日期存储为 Unix 时间戳。
我目前有多个在不同日期放映的电影实例,但所有其他信息都是相同的。
我需要将重复电影的日期复制到一个新表中,将它们与电影 ID 相匹配。然后我需要从原始表中删除重复的胶片行。
因此,我创建了一个新表 Film_Dates,其中包含列
FilmDateID
FilmID
Date
任何人都可以帮助使用实际的 SQL 来执行此操作。
谢谢。
最佳答案
首先:
insert into filmdateid (filmid, `date`)
select filmid, dateshown
from films
这应该会填充您的新表。
alter ignore table films
add unique (filmid)
这将强制 filmid 的唯一性,并删除所有重复项,仅保留一行。如果此操作因“重复条目”错误而失败,您将需要运行此命令,然后再次尝试更改。
设置 session old_alter_table=1
看来 mysql 正在远离这种方式。
最后,您需要删除显示的日期列。
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;
以及(影片名称,所示日期)上的唯一索引
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.dateshown
和 filmdates.filmname
)。
alter table filmdates drop column filmname;
alter table films drop column dateshown;
关于mysql - 合并具有不同值的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29899177/