1

嘿:我正在尝试进行 MySql 迁移,但我对这门语言非常陌生,而且语法让我很沮丧。我想做的基本想法是:

- 获取表 1 中的所有事件

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

- 设置事件的ticketing_information_id 以匹配新生成的行中的id

(然后表 2 和表 3 再次相同)

所以我对各个步骤如何工作有一些想法,但我不确定你如何在 sql 中组合各种表达式(是否有 foreach?如果我对它一无所知,我如何选择我刚刚创建的特定行识别它?)

4

3 回答 3

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 表中选择的每个值插入一个新条目。

于 2013-11-14T15:47:01.853 回答
0

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

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

INSERT INTO `block_anchor_blocks` (`anchor_slug`, `label`)
SELECT `title`, `content`
FROM `blocks` where `type` = "anchor";

如果对位于 anchor_block 上的原始块的引用作为 a 属于 this 会很容易,我本可以这样做

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";

希望这可以帮助其他尝试将大型单个表重构为多个连接表的人。

于 2016-09-20T22:17:22.000 回答
-2

你确定要这么做吗?

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

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

于 2013-11-14T15:42:04.723 回答