mysql学习小计

文章介绍了如何使用MySQL的触发器实现主表字段更新时子表相应字段的自动更新。通过在Navicat中创建BEFOREUPDATE触发器,监测主表的特定字段变化,计算差值并更新子表。同样,对于主表插入数据时更新子表库存,创建BEFOREINSERT触发器,在进货时自动调整库存表的数量。
摘要由CSDN通过智能技术生成

1,mysql主表字段更新,希望子表相应字段也更新

如果想实现任意数字增加时自动更新关联子表数据,可以使用 before update 触发器来监控主表中指定的列是否有更改,并动态计算增加的数值。

1.1 下面是一个实现动态计算增加数值的简单示例:

  1. 在 Navicat 中打开相应的数据库连接,然后进入主表设计模式

  2. 选择“触发器”选项卡,然后单击“新建触发器”按钮,创建一个新的触发器。

  3. 输入触发器的名称和说明,选择BEFORE UPDATE作为触发器类型,因为我们需要在主表数据更新之前执行相应的逻辑

  4. 输入以下 SQL 触发器代码:

CREATE TRIGGER `update_order_amount` BEFORE UPDATE ON `order`
FOR EACH ROW
BEGIN
    DECLARE amount_diff INT;

    /* check if the amount field has been updated */ 
    IF NEW.amount != OLD.amount THEN

        /* calculate the difference between the old and new amount */
        SET amount_diff = NEW.amount - OLD.amount;

        /* update the related child table(s) */
        UPDATE child_table SET child_table.column_name = child_table.column_name + amount_diff
        WHERE child_table.parent_id = OLD.id;

    END IF;
END;;

在这个代码中,我们首先声明了一个变量 amount_diff,用于计算在主表中更新的数字值的增加量。然后,我们检查 amount 字段是否发生了更改,如果发生了更改,我们计算增加的数值,然后使用 UPDATE 语句动态更新关联的子表数据。

注意:代码中的 child_table 表示您需要更新的子表,column_name 表示在子表中需要更新的数值列,parent_id 则表示子表中与主表关联的外键列,NEWOLD 分别代表更新前和更新后的主表数据。请根据您的特定数据库表结构,修改代码中的名称以匹配您的数据库表结构。

  1. 单击“确定”按钮,并保存您的触发器设置。

完成以上步骤后,当您在主表中更改数字值时,触发器将检测变化并自动更新所关联的子表数据。请注意,在更新主表数字值时,建议使用 SQL UPDATE 语句而非直接在 Navicat 中编辑数据。这样可以确保触发器能够正确地检测到更改并执行相应的逻辑。

1.2 实例

t_sale表,包含product_id、name和amount三个字段。
在这里插入图片描述
t_store表,包含product_id、name和stock_count三个字段。
在这里插入图片描述

触发器代码:
在这里插入图片描述

BEGIN
    DECLARE amount_diff INT;

    /* check if the amount field has been updated */ 
    IF NEW.amount != OLD.amount THEN

        /* calculate the difference between the old and new amount */
        SET amount_diff = NEW.amount - OLD.amount;

        /* update the related child table(s) */
        UPDATE t_store SET t_store.stock_count = t_store.stock_count + amount_diff
        WHERE t_store.product_id = OLD.product_id;

    END IF;
END

验证:
在t_sale表上新建查询

UPDATE t_sale SET amount = 50 WHERE product_id = 4

可以看到子表相应的数据也更新了

PS:

MySQL 更新命令的语法如下:

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

其中,表名称 指需要更新的表名,列名称 指需要更新的列名,新值 指需要更新的新值,WHERE 子句可选,用于指定更新数据的条件。

注意,更新时需要确保所更新的数据是唯一的,否则可能会更新多行数据。同时,更新数据需要谨慎操作,避免对原数据产生不可逆的影响。

2,主表插入数据,希望子表相应字段也更新

2.1 要实现进货商品时自动更新库存数量,您可以使用触发器来实现此功能。下面是一些基本步骤:

  1. 打开 Navicat 并连接到您的 MySQL 数据库。

  2. 创建一个库存表,用于记录商品库存数量,该表至少包含两个字段:一个是商品编号,另一个是库存数量。

  3. 找到您的进货表并右键单击,选择“设计表”。

  4. 单击左侧的“触发器”菜单,然后单击右侧的“新建触发器”按钮。

  5. 在“触发器设计向导”中,输入触发器的名称和说明。在“触发器类型”中选择“BEFORE INSERT”,这意味着在进货表插入新行之前触发触发器。

  6. 在“动作”选项卡中,输入以下 SQL 触发器代码:

   BEGIN
   DECLARE stock_count INT;
   SELECT stock_count INTO stock_count FROM inventory WHERE product_id = NEW.product_id;
   IF stock_count IS NULL THEN
       SET stock_count = 0;
   END IF;
   SET stock_count = stock_count + NEW.amount;
   UPDATE inventory SET stock_count = stock_count WHERE product_id = NEW.product_id;
   END

在这个代码中,inventory 表是库存表,product_id 是关联进货表的商品编号,stock_count 列是库存数量列,amount 列是进货数量列。当有新的进货数据的时候,触发器会首先查询库存表中对应商品编号的库存数量,如果没有找到,则默认为0。接着,在该数量上加上新的进货数量,并把结果更新至库存表中。

  1. 单击“确定”按钮,并保存您的触发器设置。

完成以上步骤后,当您在进货表中插入新行时,触发器将自动更新库存数量,并将其保存在库存表中。如果您希望在更新或删除进货表数据时也更新库存数量,请使用类似的代码在触发器中编写语句。请确保在执行此操作之前备份您的数据库。

2.2 实例

触发器代码
在这里插入图片描述

BEGIN
-- DECLARE stock_count INT;
DECLARE stock INT;
SELECT stock_count INTO stock FROM t_store WHERE product_id = NEW.product_id;
IF stock IS NULL THEN
    SET stock = 0;
END IF;
SET stock = stock + NEW.amount;
UPDATE t_store SET stock_count = stock WHERE product_id = NEW.product_id;
END

验证

INSERT INTO t_sale (product_id, name, amount)
VALUES (4, '火龙果', 25);

PS
要将数据插入到 MySQL 数据库中,您可以使用 INSERT INTO 语句。下面是一些基本步骤和示例:

  1. 打开 Navicat 并连接到您的 MySQL 数据库。

  2. 找到要插入数据的表,并确保该表中包含您要插入的所有列。

  3. 查询窗口中输入以下 SQL 命令:

   INSERT INTO <table_name> (<column1_name>, <column2_name>, ...)
   VALUES (<value1>, <value2>, ...);

其中 <table_name> 是表名, <column_name> 是列名称,<value> 是要插入的实际值。

例如,如果您要将数据插入具有三个列(id,name 和 age)的表中,则可以编写以下 SQL 代码:

   INSERT INTO mytable (id, name, age)
   VALUES (1, 'Alice', 25);

或者,如果您要将多条数据插入到同一个表中,可以使用以下 SQL 代码:

   INSERT INTO mytable (id, name, age)
   VALUES 
       (1, 'Alice', 25),
       (2, 'Bob', 30),
       (3, 'Charlie', 40);

完成以上步骤后,您的 MySQL 数据库中就已经插入了一些数据。请记住,为了确保数据安全性,您应该在向表中插入数据之前创建该表的结构,以确保所有必需的约束和验证条件都得到满足。同时,为避免 SQL 注入等安全风险,您应该使用参数化查询或正确的转义字符等方法来保护您的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值