Hola tengo una pregunta yo sé que esto fue publicado muchas veces, pero no he encontrado una respuesta a mi problema. El problema es que tengo una tabla con una columna «id» quiero que sea único número igual de normal. Este tipo de columna es de serie y el siguiente valor después de cada inserción es obtenido a partir de una secuencia, de modo que todo parece estar bien, pero todavía a veces muestra este error. No sé por qué ? En la documentación se writtne la secuencia es engañar a la profe y siempre funciona. Si puedo añadir una restricción ÚNICA para que la columna se thelp ? He trabajado muchas veces en Postres, pero este error se muestra para mí por primera vez. Hice todo como normal y nunca he tenido este problema antes. Me pueden ayudar a encontrar la respuesta que puede ser utilizado en el futuro para todas las tablas que va a ser creado ? Supongamos que tenemos algo fácil como esto:

CREATE TABLE comments
(
  id serial NOT NULL,
  some_column text NOT NULL,
  CONSTRAINT id_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE interesting.comments OWNER TO postgres;

Si puedo añadir:

ALTER TABLE comments ADD CONSTRAINT id_id_key UNIQUE(id)

Se si será suficiente o hay alguna otra cosa que se debe de hacer ?

  • Mostrar el código que la inserción de los datos; tener la clave principal ya la fuerza de una única restricción, por lo que no es necesario añadir que.
InformationsquelleAutor red | 2010-12-15

4 Comentarios

  1. 57

    En este artículo se explica que su secuencia podría estar fuera de sincronización y que usted tiene que traer manualmente de nuevo en modo de sincronización.

    Un extracto del artículo en caso de que la URL de cambios:

    Si usted recibe este mensaje al intentar insertar datos en PostgreSQL
    base de datos:

    ERROR:  duplicate key violates unique constraint

    Que probablemente significa que la clave principal de la secuencia en la mesa que está
    el trabajo con de alguna manera se ha convertido en fuera de sincronización, probablemente debido a una masa
    proceso de importación (o algo por el estilo). Llamar a un «error
    el diseño», pero parece que usted tiene para restablecer manualmente el principal
    índice de clave después de la restauración de un archivo de volcado. En cualquier caso, a ver si
    sus valores están fuera de sincronía, ejecutar estos dos comandos:

    SELECT MAX(the_primary_key) FROM the_table;   
    SELECT nextval('the_primary_key_sequence');

    Si el primer valor es mayor que el segundo valor, su secuencia es
    fuera de sincronización. Copia de seguridad de su PG base de datos (sólo en el caso), a continuación, ejecute thisL

    SELECT setval('the_primary_key_sequence', (SELECT MAX(the_primary_key) FROM the_table)+1);

    Que va a establecer la secuencia para el siguiente valor más alto
    de cualquier clave principal existente en la secuencia.

    • Para mí, yo no sabía cómo llegar «the_primary_key_sequence» — se puede ver en esta otra respuesta que se puede utilizar un método llamado pg_get_serial_sequence('table_name', 'field_name') para conseguir que esto funcione.
    • Efectivamente esta arreglado – alguien tiene alguna idea sobre cómo estos pueden salir de la sincronización, aunque?
    • SELECT setval('the_primary_key_sequence', (SELECT MAX(the_primary_key) FROM the_table)+1); que no sea totalmente correcta. Si el MAX(the_primary_key) el valor es, por ejemplo, 9 y nextval elemento es 9, es suficiente para ejecutar SELECT setval('the_primary_key_sequence', (SELECT MAX(the_primary_key) FROM the_table));. Esto debería producir automáticamente nextval secuencia de incremento. Si añade +1, el resultado estaría saltando en una secuencia. Impresionante respuesta! Me ayudó a resolver este problema!
    • si tiene alguna duda de cómo su secuencia de llamada, llamada SELECCIONE c.relname DE pg_class c DONDE c.relkind = ‘S’; si utiliza varios esquemas, tenga en cuenta que las secuencias son únicas en cada esquema, por lo que a menos que su secuencia es en el esquema público que necesita para llamar a SELECT nextval(‘esquema.sequence_name’); para conseguirlo
    • Para ser claros, el comando es: SELECT setval(pg_get_serial_sequence('table', 'id'), (SELECT MAX(id) FROM table)+1); gracias @user
    • ¿qué es 'the_primary_key_sequence' supone para ser sustituido?
    • ^ Para responder a mi propia pregunta, esto se hace para encontrarlo: \d "table_name";
    • también puede obtener the_primary_key_sequence a través de: SELECT pg_get_serial_sequence('the_table', 'the_primary_key')

  2. 3

    La clave principal ya que lo protege de la inserción de valores duplicados, ya que usted está experimentando cuando llegue ese error. La adición de otra única restricción de que no es necesario hacer eso.

    La «clave duplicada» error te está diciendo que el trabajo no estaba terminado porque produciría un duplicado de la llave, que descubrió una clave duplicada ya entregado a la mesa.

  3. -1

    En primer lugar, pensé que el problema era la secuencia :). Pero el error dice:
    ERROR: el valor de clave duplicada viola la restricción unique «ndxregnum».. Así que me busque el nombre «ndxregnum» desde mi base de datos. Me encontré con mi tabla de índices. A continuación, voy a borrar «ndxregnum». Entonces el error se ha ido. todo vuelva a la normalidad.

    Espero que esto le ayuda…

    • No estoy seguro de que puedo ver de dónde ndxregnum aparece en la pregunta, así que no creo que esto realmente proporciona una respuesta a la pregunta. Definitivamente felicitaciones por su intento de ser útil y dar alguna recomendación, pero esto podría ser más adecuado como un comentario sobre la respuesta original en lugar de un completo soplado de respuesta.
    • Si algunos existe un índice, es por alguna razón. Mejor averiguar por qué está allí antes de que la eliminación de ella, especialmente cuando usted está en la producción de env..

Dejar respuesta

Please enter your comment!
Please enter your name here