Je lis je lis la date de la date de la date CJ SQL et théorie relationnelle: Comment écrire un code SQL précis em> , et il indique que les requêtes de position sont mauvaises - par exemple, cet insert code>: à la place, vous devez utiliser l'attribut basé sur l'attribut Requêtes comme ceci: P> INSERT INTO t (one, two, three) VALUES (1, 2, 3)
9 Réponses :
La première requête rompt à peu près à tout moment le schéma de la table change. La deuxième requête accueille tout changement de schéma qui laisse ses colonnes intactes et n'ajoute pas de colonnes sans valeur. P>
personnes qui font SELECT * CODE> requêtes, puis s'appuient sur la notation de position pour extraire les valeurs qu'ils concernent sont Maintenance logicielle Supervillains pour la même raison. P>
De plus, de manière significative, les requêtes de position ne sont pas congruentes avec le modèle relationnel. Les attributs de la vraie relation sont des questions sans commande et les requêtes de position dépendent des colonnes de la table ayant une commande. Ainsi, si vous effectuez une requête de position, vous ne l'exécutez pas sur une vraie relation.
Je ne me soucie pas vraiment des concepts théoriques à cet égard (comme dans la pratique, une table
Cependant, une personne qui ignore que la première requête existe pourrait ajouter une requête au milieu des deux premiers et gâcher la requête.
@Kibbee: ... et c'est pourquoi cela ne devrait pas exister.
tandis que l'ordre des colonnes est défini em> défini dans le schéma, il ne devrait généralement pas être considéré comme important car il n'est pas conceptuel em> important. P>
En outre, cela signifie que toute personne lisant la première version doit consulter le schéma pour savoir quelles sont censées les valeurs. Certes, cela ressemble simplement à utiliser des arguments de position dans la plupart des langages de programmation, mais SQL se sent légèrement différent à cet égard - je comprendrais certainement la deuxième version beaucoup plus facilement (en supposant que les noms de colonne soient sensibles). P>
Vous devriez essayer de faire en sorte que vos requêtes SQL dépendent de la disposition exacte de la table le moins possible. P>
La première requête repose sur la table uniquement avec trois champs et dans cet ordre exact. Toute modification du tout à la table enfrette la requête. P>
La deuxième requête ne s'appuie que sur ces trois felds dans la table et que l'ordre des champs n'est pas pertinent. Vous pouvez modifier l'ordre des champs dans la table sans casser la requête et vous pouvez même ajouter des champs tant qu'ils permettent des valeurs nulles ou a une valeur par défaut. P>
Bien que vous ne réorganisez pas très souvent la disposition de la table, l'ajout de plus de champs à une table est assez courant. P>
En outre, la deuxième requête est plus lisible. Vous pouvez dire à la requête elle-même quelles sont les valeurs énoncées dans les moyens d'enregistrement. P>
SQL vous donne la syntaxe pour spécifier le nom de la colonne pour les instructions d'insertion et de sélection. Vous devez utiliser cela parce que: P>
Je préfère utiliser la syntaxe de type mise à jour: qui est beaucoup plus facile à lire et à entretenir que les exemples. P> P>
Je ne crois pas que ce soit une plate-forme croisée - au moins, T-SQL ne semble pas l'appuyer.
Une autre raison de ne pas utiliser T-SQL. ;) On dirait que ceci est principalement une extension MySQL. C'est une pitié d'autres DBMS ne l'ont pas ajouté.
L'évolution linguistique est relativement lente, en particulier pour les langues qui ont été autour d'un moment comme SQL. C'est dommage, j'aime ton exemple.
long terme, si vous ajoutez une colonne de plus à votre table, votre insert ne fonctionnera pas à moins que vous spécifiez explicitement la liste des colonnes. Si une personne modifie l'ordre des colonnes, votre insert peut réussir silencieusement à insérer des valeurs dans des colonnes incorrectes. P>
Quelque chose qui n'a pas encore été mentionné, c'est que vous recevrez souvent une clé de substitution comme votre PK, avec Mais en dehors de cela, l'ensemble "verrouillé à un schéma spécifique" est une raison beaucoup plus importante, imo. p> auto_incrènement code> (ou quelque chose de similaire) pour attribuer une valeur. Avec le premier, vous devez spécifier quelque chose em> là-bas - mais quelle valeur pouvez-vous spécifier si cela ne doit pas être utilisé?
NULL code> pourrait être une option, mais cela ne correspond pas vraiment à la prise en compte de la PK serait défini sur
pas NULL code>. P>
Je vais ajouter une chose de plus, la deuxième requête est moins sujette à une erreur par erreur, même avant que des tables ne changent. Pourquoi dois-je dire ça? Parce que la forme SEOCND vous pouvez (et si vous devez écrire la requête) Vérifiez visuellement si les colonnes de la table Insertion et les données de la clause de valeurs ou de la clause SELECT sont en fait dans le bon ordre de commencer. Sinon, vous risquez de mettre en place le numéro de sécurité sociale dans le domaine des honoraires par accident et payant leurs enceintes leur SSN au lieu du montant qu'ils devraient faire pour un discours (exemple non choisi au hasard, sauf que nous l'avions déjà attrapé avant que cela ne soit pas arrivé grâce à cela Vérification visuelle!). P>