El uso de la clave principal de incremento automático de PostgreSQL y su uso en mybatis

prefacio

Recientemente, en el proceso de migración de la base de datos del producto de MySql a PostgreSQL, en la migración y adaptación de la clave primaria de autoincremento de MySql a la clave primaria de autoincremento de PostgreSQL, después de algunos giros y vueltas, el problema finalmente se resolvió. a través del proceso de saltar y salir del foso. Por la presente registro y resumo la experiencia de los estudiantes que se han encontrado con situaciones similares.

¿Qué es una clave principal de incremento automático?

Cuando se establece 自增主键, la generación de la clave principal depende completamente de la base de datos sin intervención humana. Cuando se agregan nuevos datos, los desarrolladores no necesitan establecer manualmente el valor del campo de clave principal y la base de datos generará automáticamente un valor de clave principal.

¿Por qué necesita una clave principal de incremento automático?

  • La clave principal de incremento automático permite que el índice de la clave principal se inserte en orden creciente, evitando así la división de páginas;
  • En comparación con otros tipos (como varchar), el uso de claves primarias de incremento automático ahorra hasta cierto punto los gastos generales de almacenamiento;
  • El mantenimiento del programa de aplicación es relativamente simple, solo se requiere una configuración unificada en el código y no es necesario establecer manualmente el valor de la clave principal;

1. El uso de clave primaria de incremento automático en MySql

1. Cree una tabla con una clave principal de incremento automático

create table t_user(
	`id` INT NOT NULL AUTO_INCREMENT COMMENT '主键id',
	`age` INT(11) NOT NULL DEFAULT 10 COMMENT '年龄',
	PRIMARY KEY (`id`)
)

2. Cómo escribir SQL al insertar datos

insert into t_user(age) values(18)
insert into t_user(age) values(20)

Consultar los datos insertados arriba

 

3. Modificar el valor inicial de la clave primaria de incremento automático

En algunos casos, la aplicación necesita la clave primaria de ID para comenzar desde una posición específica, o mayor que este valor (por ejemplo: para reservar un cierto rango de ID en el medio), puede usar la siguiente instrucción sql sobre la base de un Ajuste de tabla conocida

modificar tabla t_user auto_increment=10;

Luego, inserte dos datos en la tabla anterior

insertar en t_user(edad) valores(24)
insertar en t_user(edad) valores(26)

Observe el efecto nuevamente, y puede encontrar que el valor inicial de id se convierte en 11 en este momento

 

4. Uso de clave principal de incremento automático en mybatis

Los siguientes métodos se pueden utilizar en el procesamiento de mybatis en la clave principal de incremento automático

    <insert id="addUser" parameterType="com.congge.entity.TUser">
        INSERT INTO t_user
        (age)
        VALUES (
        #{age}
        )
        <selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
            SELECT LAST_INSERT_ID();
        </selectKey>
    </insert>

Nota complementaria

Cuando se construye la tabla anterior, el incremento automático de la clave principal se limita directamente al construir la tabla, o no puede especificarlo antes de construir la tabla, pero use la declaración de alerta para modificar:

modificar tabla t_user modificar id entero auto_incremento; 

2. Uso de clave primaria de incremento automático en PostgreSQL

En PostgreSQL, el uso de la clave primaria de incremento automático es ligeramente diferente.Al crear una tabla, especifique el tipo de campo como serial para identificar el campo actual como una clave primaria de incremento automático;

En PostgreSQL, se pueden usar los siguientes dos métodos para establecer una secuencia de valores de clave principal crecientes (también se puede usar mysql)

Preparación previa, cree una tabla PG ordinaria

create table t_user(
	id INT NOT NULL ,
	age INT NOT NULL DEFAULT 10,
	PRIMARY KEY (id)
)

Método 1: creando manualmente una secuencia para lograr un efecto incremental

Cree una secuencia de incremento automático (similar a la función en mysql) y llame a esta secuencia cada vez que necesite obtener la clave principal de incremento automático.


1. Cree una secuencia de clave principal de incremento automático

CREAR SECUENCIA 
t_user_id_seq
INCREMENTO 1 -- tamaño de paso
MINVALUE 1 -- valor mínimo
MAXVALUE 9999 -- valor máximo
COMENZAR CON 1 -- valor inicial
CACHE 1; 

Después de ejecutar el método de secuencia de creación anterior, puede consultar todas las secuencias en la base de datos a través del siguiente sql

seleccione * from information_schema.sequences donde secuencia_esquema = 'público';

El círculo en la figura es el valor de secuencia que acabamos de crear arriba

 

2. Llame al método de secuencia de incremento automático para insertar datos

El siguiente paso es llamar a los métodos relacionados de la secuencia y luego usarlos en el sql de la declaración de inserción.Si desea insertar datos en la tabla t_user anterior, puede usar la siguiente operación sq,

insert into t_user values(
	nextval('t_user_id_seq') , 18
)

insert into t_user values(
	nextval('t_user_id_seq') , 22
)

 

3. Resumen de métodos comunes de secuencia de incremento automático

Se puede ver que los datos se insertan en la forma de autoincremento de clave principal como esperábamos. En la declaración de inserción anterior, se usa el método nextval, que es uno de los métodos proporcionados por defecto en la secuencia de autoincremento. La secuencia de incremento automático proporciona Los siguientes métodos proporcionan referencia común

función tipo de retorno Descripción
cargarseleccionar() Empezando Devuelve el valor más reciente de cualquier secuencia obtenida con nextval
próximo valor (clase de registro) Empezando Incrementa una secuencia y devuelve el nuevo valor
currval (clase de registro) Empezando Obtenga el valor de la secuencia especificada después del último uso de netxval. Si usa currval directamente en lugar de nextval, se producirá un error.
setval (clase de registro, bigint, booleano) Empezando Establezca el valor actual de la secuencia y el indicador is_called. Si es verdadero, tendrá efecto inmediatamente. Si es falso, tendrá efecto después de llamar a nextval una vez.
setval (clase de registro, bigint) Empezando Establece el valor actual de la secuencia.

4. Establecer el valor predeterminado de la clave principal de incremento automático

El método proporcionado anteriormente descubrió que al escribir la declaración de inserción, es necesario agregar una función, lo cual es algo engorroso. Por lo tanto, se puede considerar el siguiente método para ajustar el valor predeterminado del campo ID;

Establezca el valor predeterminado del campo id en nextval('t_user_id_seq') y agregue esta oración directamente sobre la base de la secuencia creada anteriormente

alter table 
	t_user 
alter column 
	id  
set default nextval(
	't_user_id_seq'  
);

Al insertar datos nuevamente, simplemente escríbalos directamente de la siguiente manera

insert into t_user values(
	23
)
insert into t_user values(
	24
)

Consulte los datos y descubra que todavía se pueden escribir con éxito en

 

Método 2: especificando el campo como tipo de serie para lograr el efecto incremental

1. Use la siguiente declaración de creación de tablas

create table t_user(
	id serial NOT NULL ,
	age INT NOT NULL DEFAULT 10,
	PRIMARY KEY (id)
)

2. Ver la secuencia creada

seleccione * from information_schema.sequences donde secuencia_esquema = 'público';

Tenga en cuenta que la secuencia creada antes no se limpiará a menos que se llame manualmente a la declaración para limpiar la secuencia. De forma predeterminada, el nombre de la secuencia es +id_seq. Como se creó antes, aquí se empalma automáticamente un seq1, es decir, id Usando serial, PG adjuntará una secuencia a la tabla actual por defecto;

 

3. Insertar datos

Al insertar datos nuevamente, simplemente escriba lo siguiente


insert into t_user(age) values(
	23
);
insert into t_user(age) values(
	24
);

Los datos aún se pueden encontrar y la identificación se incrementa;

 

4. El uso de la secuencia PG en mybatis

    <insert id="addUser" parameterType="com.congge.entity.TUser">
        INSERT INTO t_user
        (age)
        VALUES (
        #{age}
        )
        <selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
            SELECT nextval('t_user_id_seq'::regclass) as id
        </selectKey>
    </insert>

3. Migración de datos MySql a PostgreSQL Algunas sugerencias sobre la clave principal de incremento automático

En el negocio real, la migración a nivel de datos se puede hacer primero. Una vez que se completa la migración, el negocio se puede usar normalmente. Sin embargo, después de migrar los datos, el editor encontró que la interfaz reportó un error. La razón principal de la error fue el conflicto de clave principal. ¿Por qué? ¿Qué tal esto?

Por ejemplo, el valor máximo de la identificación de datos de la tabla t_user en mysql es 99. Después de migrar a pg, el valor máximo de los datos sigue siendo 99. Esto no es un problema, pero después de cortar la base de datos, cuando se usa el PG secuencia de incremento automático para crear datos, pero a partir de 1, después de la migración, los datos con ID 1 ya existen y, por supuesto, se informará un error;

En este momento, es necesario realizar configuraciones simples para la secuencia migrada. La idea central es la siguiente como referencia:

  • Use la función max para encontrar el valor máximo de la ID actual: seleccione max(id) de t_user;
  • Ajuste manualmente el valor inicial de la secuencia: modifique la secuencia t_user_id_seq reinicie con [el valor máximo en el primer paso o agregue un poco];

Supongo que te gusta

Origin blog.csdn.net/zhangcongyi420/article/details/127343568
Recomendado
Clasificación