嘿:我正在尝试进行MySql迁移,但我对这门语言非常陌生,语法让我很烦恼。我想做的基本思想是:
-获取表 1 中的所有事件
-对于这些事件中的每一个,在ticketing_information表中插入一行(这些事件具有自动生成的 id)
-设置事件的ticketing_information_id以匹配新生成的行中的 id
(然后表2和表3也是如此)
所以我对各种步骤如何工作有想法,但我不确定如何在 sql 中组合各种表达式(有foreach吗?如果我对它一无所知,我如何选择我刚刚创建的特定行来识别它?
也许你可以使用这个语法:
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_block上会很容易,我本可以这样做
INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`, `block_id`)
SELECT `title`, `content`, `id`
FROM `blocks` where `type` = "anchor";
但多态关系并非这种情况存在于块表中,因此我最终得到了以下代码:
/* 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";
希望这有助于其他尝试将大型单个表重构为多个联接表的人。
你确定要这样做吗?
为什么表 2 和表 3 需要与表 1 相同的信息? 我可以看到表 1 和表 2 中具有主键的唯一原因是表示一对多或多对多关系。 否则,如果是一对一关系,则可以考虑仅将这些列添加到表 1 中。
表 2 和表 3 必须有自己的主键。 这是第一种正常形式。 你应该熟悉这个意思。