MySQL INSERT avec alias de table
-
11-10-2019 - |
Question
J'arrive d'avoir deux colonnes ayant le même nom que deux mots réservés SQL, clé et la valeur. Lorsque vous utilisez l'instruction SELECT je peux créer un alias de table et résoudre de cette façon.
Maintenant, je suis en train de données INSERT et il semble que vous ne pouvez pas créer alias de table dans l'instruction INSERT.
INSERT INTO attributeStrings ats
(ats.ItemID,ats.Key,ats.Value)
VALUES (3,'Categories','TechGUI')
J'obtiens l'erreur à 'ats (ats.ItemID,ats.Key,ats.Value) VALUES (3,'Categories','TechGUI')'
indiquant que alias ne peut pas être créé.
Y a-t-il des moyens de résoudre cela sans renommer les colonnes clés et la valeur?
La solution
Utilisez back-tick pour échapper des mots réservés.
INSERT INTO `attributeStrings` (`ItemID`, `Key`,`Value`) VALUES (3,'Categories','TechGUI')
On dirait insert ne prend pas en charge alias. voir ici
Edit: ok, ref MySQL dit non alias dans insert
Il fonctionne
mysql> INSERT INTO `attributeStrings` (`ItemID`, `Key`,`Value`) VALUES (3,'Categories','TechGUI');
Query OK, 1 row affected (0.03 sec)
mysql> select * from attributeStrings;
+--------+------------+---------+
| ItemId | Key | Value |
+--------+------------+---------+
| 3 | Categories | TechGUI |
+--------+------------+---------+
1 row in set (0.00 sec)
Autres conseils
est facile d'être le type sage en fonction de votre question
INSERT INTO attributeStrings
VALUES (3,'Categories','TechGUI');
/* if the table have more than 3 columns, fill-up every column then */
Autres problèmes
Meaningless d'avoir camelCase, parce que les fenêtres ne prend pas en charge le nom de fichier avec le cas encore sensible.
Alors, vous pouvez pratiquement avoir la même table avec le cas différent dans linux / mac, mais pas sur les fenêtres
mysql> create table abc (id int(10)); Query OK, 0 rows affected (0.00 sec) mysql> create table abC (id int(10)); Query OK, 0 rows affected (0.01 sec)
il semble que vous ne pouvez pas créer alias de table dans l'instruction INSERT
Certains produits SQL (par exemple SQL Server) ne permettent cela, mais je ne suis pas sûr que c'est une bonne chose.
Selon les normes SQL, un alias devrait avoir pour effet de l'être de table matérialisée dire un INSERT
(ou tout autre saveur de mise à jour) à une table crénelage doit quitter la table de base sous-jacente (s) non affecté.
Dans SQL Server, un tel INSERT
affecte la table de base sous-jacente (s) mais je pense que l'effet réel (non conforme) est ce que la plupart des codeurs SQL compteraient se produire dans cette situation. Autrement dit, une instruction INSERT valide qui a donné lieu à aucune ligne AJOUTÉE Je pense que serait initialement soupçonné comme un bug, même si c'est la façon standard SQL est censé fonctionner.
Je pense que la situation de rejeter surgir en premier lieu, tout en étant à nouveau techniquement non conforme aux normes, est souhaitable, à mon avis.