"Entendiendo PostgreSQL" por Tu Yaofeng-Problemas y soluciones encontrados en el proceso de aprendizaje de PostgreSQL (bajo ambiente CentOS)

1. Planificación de la ruta de la base de datos, es decir, se reporta un error al personalizar la ruta de la base de datos [initdb: El directorio "/ home / postgres / pgdata" ya existe, pero no está vacío. Si desea crear un nuevo sistema de base de datos , elimine o vacíe el directorio "/ home / postgres / pgdata" o ejecute initdb con los parámetros en lugar de "/ home / postgres / pgdata".], [Inicializando la base de datos… / sbin / restorecon set context / home / postgres / pgdata- > inconfined_u: object_r: user_home_t: s0 falló: 'Operación no permitida' / home / postgres / pgdata no se puede escribir en postgres] y [creando directorio / home / postgres / pgdata… initdb: no se pudo crear el directorio "/ home / postgres" : Permiso denegado] Las
soluciones son las siguientes:
Para errores [initdb: el directorio "/ home / postgres / pgdata" ya existe, pero no está vacío. Si desea crear un nuevo sistema de base de datos, elimine o vacíe el directorio " / home / postgres / pgdata "o ejecute initdb con parámetros En lugar de" / home / postgres / pgdata ".], la razón de este error es que el directorio de ruta de la base de datos especificado [/ home / postgres / pgdata] no es un directorio vacío , por lo que debe borrar todos los contenidos para que pueda resolver el problema.
Para errores [Inicializando la base de datos… / sbin / restorecon set context / home / postgres / pgdata-> unsinfined_u: object_r: user_home_t: s0 falló: 'Operación no permitida' / home / postgres / pgdata no se puede escribir en postgres] y [creando directorio / home / postgres / pgdata… initdb: no se pudo crear el directorio "/ home / postgres": Permiso denegado], la razón de estos dos errores es que un usuario [postgres] se creará automáticamente después de que se instale e inicie PostgreSQL. comando [su-postgres] Después de cambiar a este usuario, ejecute el comando [initdb -D / home / postgres / pgdata]. Debido a los permisos del usuario [postgres] en el directorio [/ home / postgers / pgdata], estos Pueden ocurrir dos errores La solución es cambiar los usuarios y grupos de usuarios de los directorios [postgres] y [pgdata] a users [postgres], y usar el comando [chown].


2. Cambie al usuario [postgres] y ejecute el comando [pg_ctl start data path] para iniciar la base de datos, se informa un error [el puerto 5432 está ocupado].
Solución: reinicie o use el comando [pg_ctl status -D data path] para ver si la base de datos se está ejecutando. Si se está ejecutando, primero puede ejecutar el comando [pg_ctl stop -D data path] para cerrarla y luego reiniciar eso.


3. Se informa un error al realizar operaciones de actualización y eliminación en la base de datos [IntegrityError: insertar o actualizar en la tabla "..." viola la restricción de clave externa "..."].
Ejemplo del problema: hay una clave principal en la tabla de noticias y una clave principal y una clave externa en la tabla comment_news. Se establece una restricción entre la clave externa de comment_news y la clave principal de noticias en la base de datos. El contenido de la clave externa en comment_news tiene contenido diferente a la clave principal de noticias. Así que solo informa un error, solo cámbialo por el mismo.
Solución: si elimina los datos de la tabla de datos, primero debe eliminar los datos de la tabla con la clave externa y luego eliminar los datos correspondientes en la clave principal. Por ejemplo, hay una clave principal en la tabla de noticias, y una clave principal y una clave externa en la tabla comment_news. Primero elimine los datos correspondientes en la tabla comment_news y luego elimine el contenido en la tabla de noticias.


4. Se informa de un error al insertar elementos en la base de datos mediante la declaración de inserción [el valor de clave duplicado viola la restricción única]

  • Solución: Una situación posible para este tipo de error es que los datos insertados ya existen en la base de datos antes, y esta situación ocurrirá si los inserta nuevamente. Por lo tanto, podemos pensar en la solución en términos de si habrá datos duplicados.

5. Con respecto al uso de la secuencia para realizar la operación de autoincremento de un determinado campo de tipo entero en la tabla de datos.

  • Primero crea una secuencia. El código se muestra a continuación.

    create sequence seq_test
    start with 1
    increment by 1
    no minvalue
    no maxvalue
    cache 1;
    

    Donde seq_test es el nombre de la secuencia, comenzar con 1 significa comenzar desde 1, e incrementar en 1 significa aumentar en 1 cada vez.
    Luego, puede usar el comando [\ d seq_test] para ver los atributos relacionados de la secuencia. Como se muestra abajo.
    Inserte la descripción de la imagen aquí

  • Luego crea una tabla. el código se muestra a continuación.

    create table tb_test04(           
    a int not null default nextval('seq_test'), 
    b text not null, 
    c timestamp
    );
    

    En la tabla creada arriba, el campo a necesita realizar el autoincremento del valor, llamar directamente a la función nextval para recorrer la secuencia [seq_test] recién creada.


6. Al crear una tabla, especifique el tipo de campo como [serial], para que al insertar datos, el valor del campo aumente automáticamente.

  • Primero crea una tabla de datos. El código se muestra a continuación.
    create table tb_test05(
    a serial not null, 
    b text not null, 
    c timestamp
    );
    
    El mensaje después de una creación exitosa es el siguiente.
    Inserte la descripción de la imagen aquí
    Como se puede ver en el indicador anterior, se crea automáticamente una secuencia implícita. Puede observar la estructura de la secuencia creada, como se muestra en la figura siguiente.
    Inserte la descripción de la imagen aquí
    Como puede ver en la figura anterior, la secuencia de creación predeterminada es exactamente la misma que la secuencia creada por el quinto punto resumido anteriormente. Puede seguir observando la estructura de la tabla que acaba de crear, como se muestra en la siguiente figura.
    Inserte la descripción de la imagen aquí
    Puede verse en la figura anterior que el valor predeterminado del campo a es el valor de la secuencia.
  • Al insertar un nuevo dato más tarde, si no se especifica el valor del campo a, se utilizará el valor predeterminado.

7. ¿Por qué hay datos duplicados en la consulta de varias tablas?

  • Es posible que haya registros duplicados en una columna en una consulta de varias tablas, por lo que los registros duplicados se compararán varias veces al conectarse.
    Como se muestra en la figura siguiente.
    Inserte la descripción de la imagen aquí
    La columna de la derecha muestra que ambos registros son tres.
    De hecho, para 149671, se emparejó tres veces antes. Como se muestra abajo.
    Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/ISs_Cream/article/details/111222061
Recomendado
Clasificación