- 获取表1中的所有事件
- 对于这些事件中的每一个,在ticketing_information表中插入一行(这些行具有自动生成的id)
- 设置事件的ticketing_information_id以匹配新生成的行中的id
(表2和3再次相同)
所以我有关于各个步骤如何工作的想法,但我不确定你如何在sql中组合各种表达式(是否有一个foreach?我如何选择我刚刚制作的特定行,如果我什么都不知道它的独特之处在于识别它吗?)
答案 0 :(得分:2)
也许你可以使用这种语法:
INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2";
有类似的东西:
INSERT INTO ticketing_information1 (column_name)
SELECT other_column_name
FROM table1
它将为ticketing_information1表中选择的每个值插入一个新条目。
答案 1 :(得分:0)
所以我在为一个laravel多态关系编写迁移时遇到了这个问题,并且Franck的答案很接近但是错过了关于更新本地密钥以匹配新行的部分。
我在Frank的回答之后的原始迁移是
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";
但是这不是多态关系存在于block表中的情况,所以我最终得到了以下代码:
/* 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 :(得分:-1)
你确定要这么做吗?
为什么表2和表3需要与表1相同的信息?我可以看到在表2和表3中使用表1主键的唯一原因是表达一对多或多对多关系。否则,您可以考虑将这些列添加到表1,如果它是一对一的关系。
表2和表3必须有自己的主键。这是第一种正常形式。你应该熟悉这意味着。