J'essaie d'exécuter la requête suivante:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
Mais cela renvoie une erreur. Fondamentalement, je ne veux pas insérer un enregistrement si le champ "nom" de l'enregistrement existe déjà dans un autre enregistrement - comment vérifier si le nouveau nom est unique?
Réponses:
Je ne suggère pas en fait que vous le fassiez, car l'
UNIQUE
index tel que suggéré par Piskvor et d'autres est une bien meilleure façon de le faire, mais vous pouvez réellement faire ce que vous tentiez:Insérez un enregistrement:
Essayez d'insérer à nouveau le même enregistrement:
Insérez un enregistrement différent:
Etc...
Mise à jour:
Pour éviter les
#1060 - Duplicate column name
erreurs au cas où deux valeurs pourraient être égales, vous devez nommer les colonnes du SELECT interne:la source
name
, dans ce cas), si cela est possible. Notez également que vous pouvez le faireSELECT 'John', 'Doe', '022' FROM table_listnames
au lieu deSELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
- mais cela ne fonctionnera que s'iltable_listnames
contient déjà une ou plusieurs lignes. Je doute que la vitesse soit différente, donc ce n'est probablement pas un problème.WHERE
instruction appartient à laSELECT
requête. La requête Select renvoie soit une seule ligne de données (les données sont insérées), soit aucune donnée du tout (rien n'est inséré)SELECT 'Humbert', 'Humbert', '1'
dans la sélection interne). Je reçois unERROR 1060 (42S21): Duplicate column name
#1060 - Duplicate column name
. Avez-vous trouvé une solution? Edit: Je l'ai trouvé. Ajoutez derrière chaque valeur un AS:SELECT * FROM (SELECT 'Rupert' as name, 'Rupert' as friend, '022' as number) AS tmp
INSERT ne permet pas
WHERE
dans la syntaxe .Ce que vous pouvez faire: créez un
UNIQUE INDEX
sur le champ qui devrait être unique (name
), puis utilisez:INSERT
(et gérer l'erreur si le nom existe déjà)INSERT IGNORE
(quiéchouera en silenceprovoquera un avertissement (au lieu d'une erreur) si le nom existe déjà)INSERT ... ON DUPLICATE KEY UPDATE
(qui exécutera leUPDATE
à la fin si le nom existe déjà, voir la documentation )la source
mysql> show warnings\G
INSERT IGNORE
, correspond à l'expression^Duplicate entry '.+' for key '.+'$
INSERT IGNORE
OMI.Travaillé :
la source
MySQL fournit une solution très mignonne:
Très facile à utiliser puisque vous avez déclaré une clé primaire unique (ici avec la valeur 5).
la source
Voici la requête mysql, qui insère des enregistrements si elle n'existe pas et ignorera les enregistrements similaires existants.
la source
INSERT IGNORE INTO `mytable` (`field0`, `field1`, `field2`) values ('2', 12345, 12678);
?INSERT [...] IGNORE INTO mytable VALUES ...
OrINSERT [...] IGNORE INTO mytable SET col_name={expr | DEFAULT},...
Vous pouvez facilement utiliser la méthode suivante:
De cette façon, vous pouvez insérer n'importe quel nouveau brut et si vous avez des données en double, remplacer une colonne spécifique (les meilleures colonnes sont des horodatages).
Par exemple :
la source
Si vous ne pouvez vraiment pas obtenir un index unique sur la table, vous pouvez essayer ...
la source
Pour surmonter un problème similaire, j'ai modifié la table pour avoir une colonne unique. En utilisant votre exemple, lors de la création, j'aurais quelque chose comme:
puis utilisez la requête suivante lors de l'insertion:
la source
Cette requête fonctionne bien:
Et vous pouvez créer la table en utilisant la requête suivante:
Remarque: créez une table à l'aide de la deuxième requête avant d'essayer d'utiliser la première requête.
la source
Brian Hooper: Vous avez presque atteint le point mais vous avez une erreur dans votre synatx. Votre insert ne fonctionnera jamais. J'ai testé sur ma base de données et voici la bonne réponse:
Je vous donne mon exemple de table y. L'insertion est presque la même que celle de Bian Hooper, sauf que je mets la sélection FROM DUAL ont d'une autre table. Cordialement, Ivan
la source
unknown table status: TABLE_TYPE
messages, bien que la requête ait donné un résultat. Probablement parce que MySQL ne nécessite pas laFROM DUAL
clause?la source
Vous insérez pas la mise à jour du résultat. Vous pouvez définir la colonne de nom dans la colonne principale ou définir qu'elle est unique.
la source
J'ai eu un problème et la méthode conseillée par Mike a fonctionné en partie, j'ai eu une erreur Dublate Column name = '0', et j'ai changé la syntaxe de votre requête comme ceci`
Le problème était avec les noms des colonnes. sum3 était égal à sum4 et mysql a lancé des noms de colonnes en double, et j'ai écrit le code dans cette syntaxe et cela a parfaitement fonctionné,
la source
J'ai eu un problème similaire et j'ai dû en insérer plusieurs si ce n'est pas le cas. Donc, à partir des exemples ci-dessus, je suis arrivé à cette combinaison ... c'est ici juste au cas où quelqu'un en aurait besoin.
Remarque: j'ai dû définir un nom partout car MSSQL l'exigeait ... MySQL fonctionne aussi avec *.
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 [names] ([OID] INT IDENTITY (1, 1) NOT NULL, [name] NVARCHAR (32) NOT NULL, PRIMARY KEY CLUSTERED ([OID] ASC)); CRÉER UN INDEX UNCLUSTERED UNIQUE [Index_Names_Name] ON [noms] ([nom] ASC);
la source
Cette requête peut être utilisée en code PHP.
J'ai une colonne ID dans ce tableau, j'ai donc besoin de vérifier la duplication pour toutes les colonnes sauf cette colonne ID:
et maintenant un nouvel élément sera ajouté uniquement s'il n'y a pas de ligne avec des valeurs configurées dans la
SET
chaînela source