【问题标题】:Is it possible to merge two tables by primary key?是否可以通过主键合并两个表?
【发布时间】:2013-05-06 20:18:11
【问题描述】:

我有两张表,需要合并,它们是:

CREATE TABLE IF NOT EXISTS `legacy_bookmarks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` text,
  `title` text,
  `snippet` text,
  `datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `datetime` (`datetime`),
  FULLTEXT KEY `title` (`title`,`snippet`)
)

还有:

CREATE TABLE IF NOT EXISTS `legacy_links` (
  `id` mediumint(11) NOT NULL AUTO_INCREMENT,
  `user_id` mediumint(11) NOT NULL,
  `bookmark_id` int(11) NOT NULL,
  `status` enum('public','private') NOT NULL DEFAULT 'public',
  UNIQUE KEY `id` (`id`),
  KEY `bookmark_id` (`bookmark_id`)
)

如您所见,“legacy_links”包含“legacy_bookmarks”的 ID。基于这种关系,我可以将两者合并吗?

我可以轻松地将“legacy_bookmarks”中的 ID 列的名称更改为“bookmark_id”,如果这样更容易的话。

您知道,列的顺序及其类型必须准确,因为此组合表中的数据随后将被导入到新的“书签”表中。

另外,我需要能够包含其他列(“修改”列,填充“日期时间”值),并更改我所拥有的列的顺序。

有接受者吗?

【问题讨论】:

  • 您想将这些合并到一张表中吗?
  • 当然你可以在这里建立关系,但通常bookmark_id 应该是legacy_bookmarks 的外键。但即使没有它你也可以合并它们 - SELECT b.* FROM legacy_bookmarks b JOIN legacy_links l ON l.bookmark_id = b.id;
  • “修改”栏目见link
  • 是的,列的顺序和类型必须准确,因为该表中的数据随后将被导入到新的“书签”表中。

标签: mysql


【解决方案1】:

[由您更改列的顺序]

CREATE TABLE `legacy_linkss` AS
SELECT l.id, l.url, l.title, l.snippet, l.datetime AS modification, b.user_id, b.status
FROM
    `legacy_links` l 
    JOIN `legacy_bookmarks` b ON b.id = l.bookmark_id
;

之后,在检查一致性并手动添加约束后,您可以:

DROP TABLE `legacy_links`;
DROP TABLE `legacy_bookmarks`;
RENAME TABLE `legacy_linkss` TO `legacy_links`;

【讨论】:

    【解决方案2】:

    是的,它被称为联接,您可以这样做:

    SELECT *
    FROM legacy_bookmarks lb
    INNER JOIN legacy_links ll ON ll.bookmark_id = lb.id
    

    【讨论】:

    • 我熟悉的加入。但是在两张桌子之间完成是新的。埃里克,我会玩的。
    • @WayneSmallman:你很少需要只加入一个表自己,所以我想知道这些年来你是如何设法只做自加入的,不知道加入存在连接不同的表...
    • 是的,我意识到这听起来很奇怪。不,我确实使用了连接,但看起来我认为这比实际情况更复杂,但事实并非如此!
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多