【问题标题】:convert Postgresql to Mysql将 Postgresql 转换为 Mysql
【发布时间】:2021-10-28 14:08:45
【问题描述】:

这是我从另一个开发人员那里得到的由 Postgresql 编写的代码,但是我只能在我的环境中使用 mysql。有谁知道如何将代码从 Postgresql 转换为 Mysql?

只是一个免责声明,我实际上是 sql 的新手,我对下面的代码几乎一无所知 我什至不知道如何创建一个表。这真的让我感到失落。 所以我需要有人帮我把代码转移到mysql,这样我就可以在桌子上做一些实验了

第 1 部分:

1.每次插入数据时声明trigger_set_create_time_update_time()函数

2.更新数据时声明trigger_set_update_time()函数

CREATE OR REPLACE FUNCTION public.trigger_set_create_time_update_time()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
begin
  NEW.create_time = NOW() at time zone 'utc' ;
  NEW.update_time = NOW() at time zone 'utc' ;
  RETURN NEW;
END;
$function$
;


CREATE OR REPLACE FUNCTION public.trigger_set_update_time()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN
  NEW.update_time = NOW() at time zone 'utc' ;
  RETURN NEW;
END;
$function$
;

第二部分:

1.创建一个包含所有变量的表并设置一个主键。

2.创建触发器以在情况合适时调用函数。

CREATE TABLE public.good_info (
    id varchar NOT NULL,
    "name" varchar NULL,
    price int8 NOT NULL,
    create_time timestamp NOT NULL,
    update_time timestamp NOT NULL,
    CONSTRAINT good_info_pk PRIMARY KEY (id)
);

create trigger set_create_time_update_time before
insert
    on
    public.good_info for each row execute function trigger_set_create_time_update_time();

create trigger set_update_time before
update
    on
    public.good_info for each row execute function trigger_set_update_time();

【问题讨论】:

  • 我建议您提出一个问题,包括样本数据、期望的结果以及触发器应该做什么的清晰解释。
  • 如果您问是否有办法自动转换,那么答案是否定的。另外,这个论坛上没有人会为你做这件事。因此,为了回应@GordonLinoff 所说的内容,请针对您在重写代码时遇到的特定问题提出一个重点问题
  • 这个问题在我写答案时突然关闭。简短的回答是,在 MySQL 中,您不需要触发器来维护时间戳。阅读本手册以了解如何使用默认行为声明时间戳列:dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html
  • @BillKarwin 非常感谢您的帮助!
  • @BillKarwin 。 . .问题现已重新打开。

标签: mysql sql postgresql


【解决方案1】:

您似乎正在使用触发器来实现 create_timeupdate_time 列的自动值。

CREATE TABLE public.good_info (
    id varchar(10) NOT NULL,
    name varchar(10) NULL,
    price DECIMAL(9,2) NOT NULL,
    create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

其他变化:

  • MySQL 要求以最大长度声明 VARCHAR
  • MySQL 没有int8 类型。它具有 BIGINT 类型,但我假设您的 price 列应该存储货币值,因此我将使用 DECIMAL 并具有精度和比例。
  • 在 MySQL 中,主键约束始终命名为 PRIMARY,因此不必费心给它起不同的名称。

演示:

mysql> insert into good_info set id = 1234, name = 'Bill' price=19.95;
Query OK, 1 row affected (0.00 sec)

mysql> select * from good_info;
+------+------+-------+---------------------+---------------------+
| id   | name | price | create_time         | update_time         |
+------+------+-------+---------------------+---------------------+
| 1234 | Bill | 19.95 | 2021-08-29 11:12:49 | 2021-08-29 11:12:49 |
+------+------+-------+---------------------+---------------------+

...

mysql> update good_info set price = 49.95;

mysql> select * from good_info;
+------+------+-------+---------------------+---------------------+
| id   | name | price | create_time         | update_time         |
+------+------+-------+---------------------+---------------------+
| 1234 | Bill | 49.95 | 2021-08-29 11:12:49 | 2021-08-29 11:17:25 |
+------+------+-------+---------------------+---------------------+

您可以从这个演示中看到create_timeupdate_time 是自动处理的。

【讨论】:

  • 嗨,这正是我想要的。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2021-10-30
相关资源
最近更新 更多