gpt4 book ai didi

mysql将一个表分成2个,列名不同

转载 作者:行者123 更新时间:2023-11-29 01:43:49 25 4
gpt4 key购买 nike

我有一个 mysql 表,我需要将其拆分为两个。目前该表包含有关两个松散相关实体的信息。例如,实体可以是公司的员工和他被标记到的公司的笔记本电脑。下表解释了我的示例。我有一个表employee,其中包含以下列

employee_id,employee_name,employee_detail,join_date,laptop_id,laptop_type,laptop_tagged_date,laptop_details,laptop_make.

我需要将此表拆分为 2 个,如下所示。没有笔记本电脑列的 employee

employee_id,employee_name,employee_detail,join_date.

以 employee_id 作为键的新 laptop 表。

employee_id,laptop_id,laptop_type,laptop_tagged_date,laptop_details,laptop_make

以下陈述适用于当前的数据库设计

  • employee 表被后端代码大量使用。背部结束代码用 java 和 php 编写。
  • employee 表无法重命名。暗示我不想创建 2新表。我想保留 employee 表,但删除所有笔记本电脑信息。
  • 每天添加新行/更新现有行。

我的问题是

  1. 是否有一种设计方法可以让我顺利进行从当前的单表设计过渡到新的建议的设计?
  2. 是否有可遵循的最佳做法来确保顺利进行过渡。
  3. 您能否建议/重新指导我完成此任务的步骤。

最佳答案

  1. Backup您现有的数据库:

    mysqldump my_db > backup.sql
  2. 创建一个新的laptop(我在下面的例子中没有定义索引或外键约束,但你应该做任何合适的事情到你的数据结构):

    CREATE TABLE laptop
    SELECT employee_id,
    laptop_id,
    laptop_type,
    laptop_tagged_date,
    laptop_details,
    laptop_make
    FROM employee
    WHERE FALSE;
  3. 定义 triggers在原始表上将每种类型的写操作(插入/更新/删除)转发到新表:

    CREATE TRIGGER employee_insert AFTER INSERT ON employee FOR EACH ROW
    INSERT INTO laptop VALUES (
    NEW.employee_id,
    NEW.laptop_id,
    NEW.laptop_type,
    NEW.laptop_tagged_date,
    NEW.laptop_details,
    NEW.laptop_make
    );

    CREATE TRIGGER employee_update AFTER UPDATE ON employee FOR EACH ROW
    UPDATE laptop SET
    employee_id = NEW.employee_id,
    laptop_id = NEW.laptop_id,
    laptop_type = NEW.laptop_type,
    laptop_tagged_date = NEW.laptop_tagged_date,
    laptop_details = NEW.laptop_details,
    laptop_make = NEW.laptop_make
    WHERE
    employee_id <=> OLD.employee_id,
    laptop_id <=> OLD.laptop_id,
    laptop_type <=> OLD.laptop_type,
    laptop_tagged_date <=> OLD.laptop_tagged_date,
    laptop_details <=> OLD.laptop_details,
    laptop_make <=> OLD.laptop_make;

    CREATE TRIGGER employee_delete AFTER DELETE ON employee FOR EACH ROW
    DELETE FROM laptop WHERE
    employee_id <=> OLD.employee_id,
    laptop_id <=> OLD.laptop_id,
    laptop_type <=> OLD.laptop_type,
    laptop_tagged_date <=> OLD.laptop_tagged_date,
    laptop_details <=> OLD.laptop_details,
    laptop_make <=> OLD.laptop_make;
  4. 清空新表(触发器插入后的任何内容),然后在同一事务中,使用INSERT ... SELECT将原始表中的所有现有数据复制到其中:

    START TRANSACTION;

    DELETE FROM laptop;
    INSERT INTO laptop
    SELECT employee_id,
    laptop_id,
    laptop_type,
    laptop_tagged_date,
    laptop_details,
    laptop_make
    FROM employee;

    COMMIT;
  5. 彻底搜索您的代码库(包括数据库存储的程序)以查找访问原始表中笔记本电脑列的所有操作。注意每个操作是否:

    • 只读取那些列;

    • 只写入那些列;或者

    • 读取和写入这些列(例如,UPDATE employee SET laptop_tagged_date = laptop_tagged_date + INTERVAL 1 WEEK WHERE ...)。

  6. 修改读取操作以使用新表,将读取和写入操作拆分为单独的步骤(例如 UPDATE employee JOIN laptop ON ... SET employee.laptop_tagged_date = laptop.laptop_tagged_date + INTERVAL 1 WEEK哪里...).

    此更改不需要以原子方式进行,因为原始表和新表将由触发器保持同步:因此,您的应用程序的某些部分可以从新表中读取,而其他部分则继续使用原始表。

    在您对已完成此步骤感到满意之前不要继续下一步,因为下一步将导致表变得不同步。您甚至可以使用 MySQL 用户权限来阻止写入新表(触发器除外),直到您对完成此步骤感到满意为止。

  7. 修改写入操作以使用新表。

    此更改不需要以原子方式进行,因为对原始表的任何写入都将由触发器转发到新表:因此,您的应用程序的某些部分可以写入新表,而其他部分则继续写入原始表表。

  8. 从原始表中删除列:

    ALTER TABLE employee
    DROP COLUMN laptop_id,
    DROP COLUMN laptop_type,
    DROP COLUMN laptop_tagged_date,
    DROP COLUMN laptop_details,
    DROP COLUMN laptop_make;

关于mysql将一个表分成2个,列名不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12406242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com