tutorial MySQL: Inserir registro se não existir na tabela




mysql é gratuito (12)

Eu 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 eu não quero inserir um registro se o campo 'name' do registro já existir em outro registro - como verificar se o novo nome é único?


Eu tive um problema, e o método que Mike aconselhou funcionou em parte, eu tive um erro Dublicate Column name = '0', e mudei a sintaxe da sua consulta como esta '

     $tQ = "INSERT  INTO names (name_id, surname_id, sum, sum2, sum3,sum4,sum5) 
                SELECT '$name', '$surname', '$sum', '$sum2', '$sum3','$sum4','$sum5' 
FROM DUAL
                WHERE NOT EXISTS (
                SELECT sum FROM names WHERE name_id = '$name' 
AND surname_id = '$surname') LIMIT 1;";

O problema estava com os nomes das colunas. sum3 era igual a sum4 e mysql lançava nomes de coluna dublicados, e eu escrevi o código nesta sintaxe e funcionou perfeitamente,


Esta consulta pode ser usada no código PHP.

Eu tenho uma coluna de ID nesta tabela, portanto, preciso verificar a duplicação de todas as colunas, exceto desta coluna de ID:

#need to change values
SET @goodsType = 1, @sybType=5, @deviceId = asdf12345SDFasdf2345;    


INSERT INTO `devices` (`goodsTypeId`, `goodsId`, `deviceId`) #need to change tablename and columnsnames
SELECT * FROM (SELECT @goodsType, @sybType, @deviceId) AS tmp
WHERE NOT EXISTS (
    SELECT 'goodsTypeId' FROM `devices` #need to change tablename and columns names
    WHERE `goodsTypeId` = @goodsType
        AND `goodsId` = @sybType
        AND `deviceId` = @deviceId
) LIMIT 1;

e agora um novo item será adicionado apenas no caso de não existir uma linha com valores configurados na string SET


INSERT IGNORE INTO `mytable`
SET `field0` = '2',
`field1` = 12345,
`field2` = 12678;

Aqui a consulta mysql, que insere registros se não existirem e irá ignorar registros similares existentes.

----Untested----

Trabalhado:

INSERT INTO users (full_name, login, password) 
  SELECT 'Mahbub Tito','tito',SHA1('12345') FROM DUAL
WHERE NOT EXISTS 
  (SELECT login FROM users WHERE login='tito');

Brian Hooper: Você quase acertou o ponto, mas você tem um erro na sua synatx. Sua inserção nunca funcionará. Eu testei no meu banco de dados e aqui está a resposta certa:

INSERT INTO podatki (datum,ura,meritev1,meritev1_sunki,impulzi1,meritev2,meritev2_sunki,impulzi2)
            SELECT '$datum', '$ura', '$meritve1','$sunki1','$impulzi1','$meritve2','$sunki2','$impulzi2'
                FROM dual
                WHERE NOT EXISTS (SELECT datum,ura
                                      FROM podatki
                                      WHERE datum='$datum' and ura='$ura'

Estou te dando meu exemplo de tabela. Insert é quase o mesmo como Bian Hooper escreveu, exceto que eu coloquei o select FROM DUAL ont de outra tabela. Cind considera, Ivan


Na verdade, não estou sugerindo que você faça isso, já que o índice UNIQUE conforme sugerido por Piskvor e outros, é uma maneira muito melhor de fazer isso, mas você pode realmente fazer o que estava tentando:

CREATE TABLE `table_listnames` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `tele` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

Insira um registro:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM `table_listnames`;

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
+----+--------+-----------+------+

Tente inserir o mesmo registro novamente:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
+----+--------+-----------+------+

Insira um registro diferente:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'John'
) LIMIT 1;

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM `table_listnames`;

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
|  2 | John   | Doe       | 022  |
+----+--------+-----------+------+

E assim por diante...


Se você realmente não consegue um índice único na tabela, você pode tentar ...

INSERT INTO table_listnames (name, address, tele)
    SELECT 'Rupert', 'Somewhere', '022'
        FROM some_other_table
        WHERE NOT EXISTS (SELECT name
                              FROM table_listnames
                              WHERE name='Rupert')
        LIMIT 1;

Você pode facilmente usar o seguinte caminho:

INSERT INTO ... ON DUPLICATE KEY UPDATE ...

Desta forma, você pode inserir qualquer novo raw e, se tiver dados duplicados, substitua a coluna específica (as melhores colunas são timestamps).
Por exemplo :

CREATE TABLE IF NOT EXISTS Devices (
  id         INT(6)       NOT NULL AUTO_INCREMENT,
  unique_id  VARCHAR(100) NOT NULL PRIMARY KEY,
  created_at VARCHAR(100) NOT NULL,
  UNIQUE KEY unique_id (unique_id),
  UNIQUE KEY id (id)
)
  CHARACTER SET utf8
  COLLATE utf8_unicode_ci;

INSERT INTO Devices(unique_id, time) 
VALUES('$device_id', '$current_time') 
ON DUPLICATE KEY UPDATE time = '$current_time';

Para superar um problema semelhante, fiz a tabela que estou inserindo para ter uma coluna exclusiva. Usando o seu exemplo, na criação eu teria algo como:

name VARCHAR(20),
UNIQUE (name)

e use a seguinte consulta ao inserir:

INSERT IGNORE INTO train
set table_listnames='Rupert'

O MySQL fornece uma solução muito fofa:

REPLACE INTO `table` VALUES (5, 'John', 'Doe', SHA1('password'));

Muito fácil de usar desde que você declarou uma chave primária exclusiva (aqui com valor 5).


insert into customer_keyskill(customerID, keySkillID)
select  2,1 from dual
where not exists ( 
    select  customerID  from customer_keyskill 
    where customerID = 2 
    and keySkillID = 1 )

Você está inserindo não atualizando o resultado. Você pode definir a coluna de nome na coluna principal ou defini-la como única.





mysql