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