Estaba mirando la INSERT INTO .. ON CONFLICT (..) DO UPDATE ..
sintaxis de PostgreSQL y me di cuenta de que no puede hacer múltiples comprobaciones de restricciones únicas con ella. Quiero decir, o se refiere a un índice único compuesto por los nombres de las columnas ON CONFLICT (Name, Symbol)
(si el índice único está definido para estas dos columnas), o usa la clave primaria. Si define dos índices únicos separados para las columnas, solo puede verificar uno.
CREATE TABLE student
(Id int primary key, Name varchar(50), Symbol varchar(50),
CONSTRAINT col1_unique UNIQUE (Name),
CONSTRAINT col2_unique UNIQUE (Symbol)
);
INSERT INTO student
(Id, Name, Symbol)
VALUES
(1, 'John', 'J'),
(2, 'David', 'D'),
(3, 'Will', 'W');
INSERT INTO student
(Id, Name, Symbol)
VALUES
(4, 'Jeremy', 'J')
on conflict(Name) DO UPDATE
set Name = 'Jeremy';
Podría arrojar un error, diciendo que J
es un duplicado. Sin embargo, este ejemplo es simplemente un mal diseño, porque el Símbolo debe estar en otra mesa y estar conectado a la mesa del alumno a través de una relación de uno a muchos. Es por eso que me pregunto, tal vez PostgreSQL on conflict
fue diseñado de esta manera, porque SIEMPRE puede reestructurar las tablas de una manera, donde solo hay un único índice único. ¿Es cierto o hay otra razón?
Violín de ejemplo: http://www.sqlfiddle.com/#!17/9c0ce
fuente
Respuestas:
Siempre hay sexta, o clave de dominio, forma normal. Aquí cada columna sin clave se convierte en su propia tabla. Por lo tanto, la tabla 3NF T (Clave, Col1, Col2, ..) se convierte en T1 (Clave, Col1), T2 (Clave, Col2), etc. Las tablas nuevas que requieren unicidad pueden hacer que se declare.
Sin embargo, creo que tener múltiples restricciones únicas en una tabla está perfectamente bien. Tomemos por ejemplo una tabla de países. Esto tendría, por ejemplo, una identificación, el nombre, el código ISO, la ciudad capital y algunos otros. Cada uno de esos primeros cuatro será único. Además, si queremos que nuestro sistema se base en que cada uno sea único, creo que deberíamos definir restricciones únicas para cada uno. Esto impone verdades sobre los datos en los que pueden confiar todos los consumidores.
fuente
MERGE
declaración). El pgON CONFLICT DO UPDATE
solo se agregó en 9.5 y es mucho más limitado.ON CONFLICT DO NOTHING
sin mencionar restricciones únicas y las considerará todas (y no hará nada). Cuando quiera hacerloON CONFLICT DO UPDATE
, debe declarar una columna o una restricción y solo una. La restricción podría ser levantada en futuras versiones.ON CONFLICT ... DO UPDATE
y por desgracia, esta respuesta no aborda ese punto.