Haga un balance de las diferencias entre PostgreSQL y MySQL

Como se mencionó en el número anterior, el entorno de datos se cambió de MySQL a PostgreSQL.
Entonces, para que todos eviten trampas en el futuro, resumo brevemente las trampas que he pisado y los puntos que necesitan atención.
En primer lugar, PostgreSQL tiene un concepto de modo.
1. Diferencia de formato:

Al igual que Oracle, PostgreSQL distingue estrictamente entre mayúsculas y minúsculas.

En segundo lugar, la diferencia entre los símbolos:

Al igual que Oracle, en PostgreSQL, " " se utilizan comillas dobles para distinguir nombres de bibliotecas, palabras clave, etc., mientras que en MySQL 反单引号(la tecla sobre la tecla de tabulación), se deben utilizar comillas simples para campos de tipo de carácter cuando se realizan consultas pg, y MySQL tiene un optimizador (no es necesario).

Tres, diferencia autocreciente:

Use auto_increment en MySQL para especificar el incremento automático en las columnas requeridas, mientras que pg necesita establecer la secuencia de incremento automático.

(1)
Al usar la instrucción SQL ① para crear una tabla

CREATE table infisa_template_config(id serial );

②La tabla ya existe

<--设置序列从1开始,自增1-->
CREATE SEQUENCE user_id_seq START WITH 1  
INCREMENT BY 1  NO MINVALUE  NO MAXVALUE  CACHE 1;
<--设置序列-->
ALTER table user ALTER column id SET DEFAULT nextval('user_id_seq');

(2) Use una herramienta de visualización
para conectarse a navicat15 (o use DBeaver)
inserte la descripción de la imagen aquí
y haga clic en la secuencia
inserte la descripción de la imagen aquí
para crear una nueva secuencia a través de la interfaz visual
inserte la descripción de la imagen aquí
Nota: Para sincronizar datos, se recomienda crear una nueva secuencia a través de sql.

4. Diferencia de funciones:
(1) Conversión de tiempo

① Tiempo hasta la cadena de caracteres:

MySQL: formato_fecha(a.tag_create_date,'%Y-%m-%d %H:%i:%s')

PostgreSQL: to_char(a.tag_create_date,'aaaa-mm-dd HH:MM:SS')

② Tiempo de conversión de cadenas:

MySQL: formato_fecha(a.tag_create_date,'%Y-%m-%d %H:%i:%s')

PostgreSQL: to_date(a.tag_create_date,'aaaa-mm-dd HH:MM:SS')

(2) Función IFNULL()

MySQL: IFNULL(a.idm,'')

PostgreSQL: COALESCE(a.id,'')

(3) función sysdate()

MySQL: SELECCIONE fecha del sistema ()

PostgreSQL: SELECCIONE ahora ()

(4) función find_in_set() (permite encontrar la posición de una cadena específica en una lista de cadenas separadas por comas)

MySQL: SELECCIONE t.dept_id DESDE sys_dept t DONDE find_in_set('100', antepasados)

PostgreSQL: SELECCIONE t.dept_id DESDE sys_dept t DONDE '100' = CUALQUIERA (string_to_array(antepasados, ','))

(5) función group_concat()

MySQL: seleccione a.name,group_concat(distinct city) from user_city un grupo por a.name;

PostgreSQL: seleccione a.name,array_to_string(array_agg(distinct a.city),',')from user_city un grupo por a.name;

(6)LÍMITE

MySQL: seleccione id, nombre de hospital.ods_user_basic límite 10,2;

PostgreSQL: seleccione id, nombre de hospital.ods_user_basic limit 10 offset 2;

(7) DISTINTO

MYSQL: seleccione DISTINCT b.id de hospital.ods_user_basic como b

PostgreSQL: seleccione DISTINCT ON (b.id) b.* de hospital.ods_user_basic como b

(Nota: en pg, deduplicación + clasificación, use distinto en (columna 1) ordenar por columna 1)

(8) MyBatis-Plus integra MySQL y PostgreSQL, LIKE usa
MySQL:

	<select id="checkReportPage" resultMap="reportResultMap">
       SELECT
       *
       FROM
       infisa_medical_report
       WHERE is_deleted=0 AND status = 1 AND name LIKE concat('%',#{handleTask.name},'%')
    </select>

PostgresSQL:

	<select id="checkReportPage" resultMap="reportResultMap">
       SELECT
       *
       FROM
       infisa_medical_report
       WHERE is_deleted=0 AND status = 1 AND name like concat('%',#{handleTask.name}::varchar,'%')
    </select>

(Nota: pg debe especificar el tipo de datos de la columna de consulta aproximada; de lo contrario, se informará un error)

5. Conversión de tipos de datos (para PostgreSQL):
MySQL, Oracle, etc., convierten implícitamente los tipos de datos de forma predeterminada. En otras bases de datos, varchar y otros tipos de cadenas y números se pueden convertir automáticamente de forma implícita, pero PG no lo hace. De esta manera, el oficial El documento también tiene un método de conversión de datos para la pág.

Solución:
① Forzar el reenvío (especifique el tipo de datos en el campo de consulta)

a.a1 = b.b1::int8 valor a.a1::varchar = b.b1

② Conversión de tipo implícita (crear conversión de tipo)

– Nota: la creación de una conversión requiere el permiso de la tabla del sistema pg_cast
– Nota: al crear una conversión de tipo mediante la conversión implícita automática, si hay varias conversiones coincidentes, pg informará un error porque no sabe cuál elegir para procesar la conversión de tipo:
si coinciden varias conversiones automáticas implícitas, aún necesita agregar conversiones manualmente para lograr el efecto, o eliminar conversiones de
tipo
redundantes COMO IMPLÍCITO,
CREAR CAST (BIGINT COMO VARCHAR) CON INOUT COMO IMPLÍCITO,
CREAR CAST (VARCHAR COMO BIGINT) CON INOUT COMO IMPLÍCITO;

Adjunto:
③Consulta conversión de tipo actual:

– Esta consulta es todo el CAST actual, la definición de campos específicos también puede referirse a la descripción en el documento oficial de la base de datos de PG
seleccione
(seleccione typname de pg_type donde oid = t.castsource) como “castsource”,
(seleccione typname de pg_type donde oid = t .casttarget) como “casttarget”,
castcontext,
castmethod
de pg_cast como t

④ Eliminar conversión de tipo:

DROP CAST (varchar como bigint); DROP CAST (bigint como varchar);

Supongo que te gusta

Origin blog.csdn.net/weixin_47162914/article/details/126662477
Recomendado
Clasificación