【问题标题】:How to create a Trigger in a google cloud sql instance Database如何在谷歌云 sql 实例数据库中创建触发器
【发布时间】:2023-03-25 21:15:01
【问题描述】:

在我的数据库中创建触发器时遇到问题。 我的谷歌云 sql 中有一个带有数据库(名称:test)的 MySQL 第二代实例。

现在我的数据库中有多个表,我正在尝试使用以下方法在其中一个表中创建触发器:

CREATE TRIGGER date_overlap_insert_start_date
BEFORE INSERT ON driver_operation
FOR EACH ROW 
BEGIN
  if exists(
            select 1
            from driver_operation
            where nif = NEW.nif
            and (NEW.start_date > start_Date and NEW.start_date < end_Date)) then
               signal sqlstate '45000' SET MESSAGE_TEXT = 'Overlaps with existing data';
  end if;
END;

我得到的错误是: 错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 10 行的 '' 附近使用正确的语法

有没有人可以帮助我解决这个问题?此触发器是为了防止日期字段重叠。

【问题讨论】:

    标签: mysql google-cloud-sql


    【解决方案1】:

    关于谷歌云平台,一个重要的事情是转到您的实例配置,即“编辑配置”,然后转到“标志”并确保“log_bin_trust_function_creators”设置为打开。这将解决 GCP 制作触发器的问题,并允许您在 MySQL Workbench CE 8.0 中创建触发器而不会崩溃。

    【讨论】:

    • 另一个有用的提示是不要使用 Begin/End 除非你有条件,或者它是完全必要的。大多数简单的日志函数都可以不用它们编写,通过GCP对mySQL来说更容易。
    • 如果您需要,请随时询问
    【解决方案2】:

    我今天遇到了同样的问题。这只是由于云 sql 实例将每个分号视为语句的结尾,所以我只能假设它每次遇到一个分号时都会尝试执行。

    尝试使用以下方法创建触发器:

    /*!50003 CREATE*/ /*!50003 TRIGGER date_overlap_insert_start_date
    BEFORE INSERT ON driver_operation
    FOR EACH ROW 
    BEGIN
      if exists(
            select 1
            from driver_operation
            where nif = NEW.nif
            and (NEW.start_date > start_Date and NEW.start_date < end_Date)) 
    then
               signal sqlstate '45000' SET MESSAGE_TEXT = 'Overlaps with 
    existing data';
    end if;
    END */
    

    编辑以修复我的语法。缺少一个分号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2020-08-17
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多