【问题标题】:How to copy column values to a new SQL table, remove duplicates and create mappings?如何将列值复制到新的 SQL 表、删除重复项并创建映射?
【发布时间】:2020-11-30 18:24:30
【问题描述】:

我有一张桌子Excerpt

    CREATE TABLE IF NOT EXISTS excerpt(
      excerptID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
      author VARCHAR(45) NOT NULL, 
      title VARCHAR(255) NOT NULL, 
      text VARCHAR(2500) NOT NULL,
      comments VARCHAR(2500) NOT NULL,
      PRIMARY KEY (excerptID)
    ) ENGINE=INNODB CHARACTER SET utf8mb4;

并希望删除其列Author,同时将其(通常是重复的)值和有关这些值的信息分配到两个新表中Author

CREATE TABLE IF NOT EXISTS author(
  authorID INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NOT NULL , 
  PRIMARY KEY (authorID)
) ENGINE=INNODB CHARACTER SET utf8mb4;

AuthorMap:

CREATE TABLE IF NOT EXISTS authormap (
  excerptID INT UNSIGNED NOT NULL, 
  authorID INT UNSIGNED NOT NULL, 
  PRIMARY KEY (excerptID, authorID),
    CONSTRAINT authorMapFK FOREIGN KEY (excerptID) REFERENCES excerpt (excerptID)
    ON DELETE CASCADE 
    ON UPDATE CASCADE,
    CONSTRAINT authorFK FOREIGN KEY (authorID) REFERENCES author (authorID)
    ON DELETE CASCADE 
    ON UPDATE CASCADE
) ENGINE=INNODB;

应删除所有重复项并将 excerptIDauthorID 之间的映射放入 AuthorMap,即最终所有唯一作者姓名应在表 Author 中,他们的创建的 ID 和所有 ExcerptID 应与新创建的 AuthorID 一起复制到 AuthorMap

我该怎么做?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以将表authors 创建为:

    create table authors (
        author_id int auto_increment primary key,
        name varchar(255)  -- or whatever
    );
    
    insert into authors (name)
        select distinct author
        from excerpt;
    

    然后创建作者映射表为:

    create table excerptAuthors (
        excerptAuthorsId int auto_icnrement primary key,
        excerptid int,
        authorid int
    );
    

    最后:

    insert into excerptAuthors (excerptId, authorId)
        select e.excerptId, a.authorId
        from excerpts e join
             authors a
             on e.author = a.name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2018-02-08
      • 2013-11-09
      • 2020-10-17
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多