Estou tentando executar a seguinte consulta:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
Mas isso retorna um erro. Basicamente, não quero inserir um registro se o campo 'nome' do registro já existir em outro registro - como verificar se o novo nome é exclusivo?
Respostas:
Na verdade, não estou sugerindo que você faça isso, pois o
UNIQUE
índice sugerido por Piskvor e outros é uma maneira muito melhor de fazê-lo, mas você pode realmente fazer o que estava tentando:Inserir um registro:
Tente inserir o mesmo registro novamente:
Insira um registro diferente:
E assim por diante...
Atualizar:
Para evitar
#1060 - Duplicate column name
erros no caso de dois valores serem iguais, você deve nomear as colunas do SELECT interno:fonte
name
neste caso), se possível. Observe também que você pode fazerSELECT 'John', 'Doe', '022' FROM table_listnames
, em vez deSELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
- mas isso só funcionará setable_listnames
já contiver uma ou mais linhas. Duvido que a velocidade seja diferente, então provavelmente não é uma preocupação.WHERE
instrução pertence àSELECT
consulta. A consulta Select retorna uma única linha de dados (os dados são inseridos) ou nenhum dado (nada é inserido) #SELECT 'Humbert', 'Humbert', '1'
na seleção interna). Eu recebo umERROR 1060 (42S21): Duplicate column name
#1060 - Duplicate column name
. Você encontrou uma solução? Edit: Encontrei. Adicione por trás de cada valor um AS: #SELECT * FROM (SELECT 'Rupert' as name, 'Rupert' as friend, '022' as number) AS tmp
INSERT não permite
WHERE
na sintaxe .O que você pode fazer: crie um
UNIQUE INDEX
no campo que deve ser exclusivo (name
) e use:INSERT
(e lide com o erro se o nome já existir)INSERT IGNORE
(quefalhará silenciosamentecausa um aviso (em vez de erro) se o nome já existir)INSERT ... ON DUPLICATE KEY UPDATE
(que executaráUPDATE
no final se o nome já existir, consulte a documentação )fonte
mysql> show warnings\G
INSERT IGNORE
, corresponde à regex de^Duplicate entry '.+' for key '.+'$
INSERT IGNORE
IMO.Trabalhou:
fonte
O MySQL fornece uma solução muito fofa:
Muito fácil de usar, pois você declarou uma chave primária exclusiva (aqui com o valor 5).
fonte
Aqui, a consulta mysql, que insere registros, se não existir, ignorará os registros semelhantes existentes.
fonte
INSERT IGNORE INTO `mytable` (`field0`, `field1`, `field2`) values ('2', 12345, 12678);
?INSERT [...] IGNORE INTO mytable VALUES ...
OuINSERT [...] IGNORE INTO mytable SET col_name={expr | DEFAULT},...
Você pode usar facilmente da seguinte maneira:
Dessa maneira, você pode inserir novos dados brutos e, se houver dados duplicados, substituir a coluna específica (as melhores colunas são os carimbos de data e hora).
Por exemplo :
fonte
Se você realmente não consegue obter um índice exclusivo sobre a tabela, tente ...
fonte
Para superar um problema semelhante, modifiquei a tabela para ter uma coluna exclusiva. Usando seu exemplo, na criação, eu teria algo como:
e use a seguinte consulta ao inseri-lo:
fonte
Esta consulta funciona bem:
E você pode criar a tabela usando a seguinte consulta:
Nota: Crie a tabela usando a segunda consulta antes de tentar usar a primeira consulta.
fonte
Brian Hooper: Você quase acertou no alvo, mas você tem um erro na sua sintaxe. Sua inserção nunca funcionará. Eu testei no meu banco de dados e aqui está a resposta certa:
Estou lhe dando meu exemplo da tabela y. Insert é quase o mesmo que Bian Hooper escreveu, exceto que eu coloquei o select FROM DUAL em outra tabela. Cind cumprimentos, Ivan
fonte
unknown table status: TABLE_TYPE
mensagens, embora a consulta tenha produzido um resultado. Provavelmente porque o MySQL não requer aFROM DUAL
cláusula?fonte
Você está inserindo não atualizando o resultado. Você pode definir a coluna de nome na coluna principal ou defini-la como única.
fonte
Tive um problema e o método que Mike aconselhou funcionou parcialmente, tive um erro Dublicate Column name = '0' e alterei a sintaxe da sua consulta como esta`
O problema estava com os nomes das colunas. sum3 era igual a sum4 e o mysql lançou nomes de colunas dublicate, e eu escrevi o código nessa sintaxe e funcionou perfeitamente,
fonte
Eu tive um problema semelhante e precisava inserir vários, se não existir. Então, pelos exemplos acima, cheguei a essa combinação ... está aqui apenas no caso de alguém precisar.
Nota: Eu tive que definir o nome em todos os lugares, conforme exigido pelo MSSQL ... O MySQL também trabalha com *.
MySQL: CREATE TABLE
names
(OID
int (11) NOT NULL AUTO_INCREMENT,name
varchar (32) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (OID
), UNIQUE KEYname_UNIQUE
(name
)) ENGINE = InnoDB AUTO_INCREMENT = 1;ou
MSSQL: CREATE TABLE [nomes] ([OID] INT IDENTITY (1, 1) NÃO NULL, [nome] NVARCHAR (32) NÃO NULL, CHAVE PRIMÁRIA CLUSTERED ([OID] ASC)); CRIAR ÍNDICE EXCLUSIVO NÃO EXCLUSIVO [Index_Names_Name] ON [names] ([name] ASC);
fonte
Esta consulta pode ser usada no código PHP.
Eu tenho uma coluna de ID nesta tabela, portanto, preciso verificar se há duplicação para todas as colunas, exceto esta coluna de ID:
e agora o novo item será adicionado apenas no caso de não existir uma linha com valores configurados na
SET
sequênciafonte