Estou tendo dificuldades para formar um INSERT condicional
Eu tenho x_table com colunas (instância, usuário, item) onde o ID da instância é único. Quero inserir uma nova linha apenas se o usuário já não tiver um determinado item.
Por exemplo, tentando inserir instance = 919191 user = 123 item = 456
Insert into x_table (instance, user, item) values (919191, 123, 456)
ONLY IF there are no rows where user=123 and item=456
Qualquer ajuda ou orientação na direção certa seria muito apreciada.
fonte
dual
necessidade de ser criada antes da mão, neste caso, ou é algum tipo de especial mesa "temporário" criado pela consulta para o uso da consulta sozinho?dual
, você precisa criá-lo.CREATE TABLE dual ( dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY ); INSERT INTO dual VALUES('x'); REVOKE ALL ON dual FROM PUBLIC; GRANT SELECT ON dual TO PUBLIC;
SELECT COUNT(*) FROM dual
sempre consegue1
, e seSELECT 'foo' FROM dual
você sempre conseguefoo
. Mas você não podeSELECT * FROM dual
e você não podeDESCRIBE dual
ou algo parecido. Não verifiquei, mas também não acho que você possa revogar as permissões nodual
. Portanto, é importante ressaltar que funciona como você espera ... exceto quando não;)Você também pode usar o
INSERT IGNORE
que ignora silenciosamente a inserção em vez de atualizar ou inserir uma linha quando você tem um índice exclusivo ativado (usuário, item).A consulta será semelhante a esta:
Você pode adicionar o índice exclusivo com
CREATE UNIQUE INDEX user_item ON x_table (user, item)
.fonte
Você já tentou algo assim?
fonte
Com um
UNIQUE(user, item)
, faça:o
user=123
bit é "no-op" para corresponder à sintaxe daON DUPLICATE
cláusula sem realmente fazer nada quando há duplicatas.fonte
Caso você não queira definir uma restrição exclusiva, isso funciona perfeitamente:
Espero que ajude !
fonte
O que você quer é
INSERT INTO table (...) SELECT ... WHERE ...
. do manual do MySQL 5.6 .No seu caso é:
Ou talvez, já que você não está usando nenhuma lógica complicada para determinar se deve
INSERT
ou não executar o, você poderia apenas definir umaUNIQUE
chave na combinação dessas duas colunas e, em seguida, usarINSERT IGNORE
.fonte
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where...
(executando 5.6.34)from dual
anteswhere
.FROM DUAL
é o padrão se nenhuma tabela for referenciada ( consulte esta documentação ).Se você adicionar uma restrição que (x_table.user, x_table.item) seja única, a inserção de outra linha com o mesmo usuário e item falhará.
por exemplo:
fonte
Embora seja bom verificar se há duplicação antes de inserir seus dados, sugiro que você coloque uma restrição / índice exclusivo em suas colunas para que nenhum dado duplicado possa ser inserido por engano.
fonte
Você pode usar a seguinte solução para resolver seu problema:
fonte
Ligeira modificação na resposta de Alex, você também pode apenas fazer referência ao valor da coluna existente:
fonte
Então, este significa PostgreSQL
fonte
A sintaxe pode variar dependendo do seu banco de dados ...
fonte