MySql:为不同表中的每个现有行在新表中创建行

MySql:为不同表中的每个现有行在新表中创建行,mysql,Mysql,嘿:我正在尝试进行MySql迁移,但我对这种语言非常陌生,语法让我感到困惑。我想做的基本想法是: -获取表1中的所有事件 -对于每个事件,在ticketing_信息表中插入一行(这些事件具有自动生成的id) -将事件的票务信息id设置为与新生成行中的id匹配 (表2和表3也是如此) 因此,我对各个步骤的工作方式有一些想法,但我不确定如何在sql中组合各种表达式(是否有foreach?如果我不知道如何识别我刚才创建的特定行,如何选择该行?您确定要这样做吗 为什么表2和表3需要与表1相同的信息?我认

嘿:我正在尝试进行MySql迁移,但我对这种语言非常陌生,语法让我感到困惑。我想做的基本想法是:

-获取表1中的所有事件

-对于每个事件,在ticketing_信息表中插入一行(这些事件具有自动生成的id)

-将事件的票务信息id设置为与新生成行中的id匹配

(表2和表3也是如此)


因此,我对各个步骤的工作方式有一些想法,但我不确定如何在sql中组合各种表达式(是否有foreach?如果我不知道如何识别我刚才创建的特定行,如何选择该行?

您确定要这样做吗

为什么表2和表3需要与表1相同的信息?我认为在表2和表3中使用表1主键的唯一原因是表示一对多或多对多关系。否则,您可能会考虑将这些列添加到表1,如果是一对一的关系。


表2和表3必须有自己的主键。这是第一个范式。您应该熟悉这意味着。

也许您可以使用以下语法:

INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2";
比如说:

INSERT INTO ticketing_information1 (column_name)
SELECT other_column_name
FROM table1

它将为ticketing_information1表中选择的每个值插入一个新条目。

因此,我在为laravel多态关系编写迁移时遇到了这个问题,Franck的答案很接近,但忽略了更新本地键以匹配新行的部分

弗兰克回答后,我最初的迁移是

INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`)
SELECT `title`, `content`
FROM `blocks` where `type` = "anchor";
如果对anchor_块上的原始块的引用属于这一块,那么就很容易了,我可以这样做

INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`, `block_id`)
SELECT `title`, `content`, `id`
FROM `blocks` where `type` = "anchor";
但多态关系并不存在于blocks表中,因此我最终得到了以下代码:

/* Create The New Table */
CREATE TABLE `block_anchor_blocks` (
   `id` CHAR(36) PRIMARY KEY,
   `anchor_slug` VARCHAR(255),
   `label` VARCHAR(255),
   `created_at` TIMESTAMP,
   `updated_at` TIMESTAMP
);


/* Build the polymorphic fields on the table we're refactoring */
ALTER TABLE `blocks`
ADD `blockable_id` CHAR(36);
ALTER TABLE `blocks`
ADD `blockable_type` VARCHAR(255);

/* Generate the UUID to use when creating an entry in the new table. */
UPDATE `blocks`
SET `blockable_id`=(SELECT UUID()),`blockable_type`="Acme\\Shared\\Entities\\Blocks\\AnchorBlock"
WHERE `type` = "anchor";

/* Finally we Insert using the ID we generated in the last step */
INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`, `id`, `created_at`, `updated_at`)
SELECT `title`, `content`, `blockable_id`, NOW(), NOW()
FROM `blocks` where `type` = "anchor";

希望这能帮助其他试图将一个大的单表重构为多个联接表的人。

好的,从表1中获得想法,但是从哪里获取用于记录信息的其余数据呢?虽然一开始语法可能有点混乱,但MySQL的SQL与您在其他数据库中使用的SQL非常相似,因此,这是一项在未来会带来红利的投资。一般来说,您对SQL有很好的参考吗?票务信息的数据现在只是默认值。不,我真的不知道任何SQLTable1、2和3都是不同类型的事件,彼此完全独立。然而,它们都需要一个“票务信息”实体。因为可能有两个不同类型的事件具有相同的ID,所以我选择使用票务信息ID作为事件和票务信息之间的链接。不同的事件应具有不同的主键,但是他们可以用外键引用票务信息。我需要这样做,以便编写迁移,根据类型将表1中的数据推送到表2-5中。我将数据从一个表推送到一个laravel多态关系中。这是从原始表中删除列之前迁移数据的关键步骤。