7
votes

Pourquoi les requêtes de position sont-elles mauvaises?

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>: xxx pré>

à 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)


0 commentaires

9 Réponses :


20
votes

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.

personnes qui font SELECT * 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.


1 commentaires

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.



5
votes

Je ne me soucie pas vraiment des concepts théoriques à cet égard (comme dans la pratique, une table a une commande de colonne définie). La principale raison pour laquelle je préférerais le second à la première est une couche ajoutée d'abstraction . Vous pouvez modifier des colonnes dans une table sans visser vos requêtes.


2 commentaires

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.



9
votes

tandis que l'ordre des colonnes est défini défini dans le schéma, il ne devrait généralement pas être considéré comme important car il n'est pas conceptuel important.

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).


0 commentaires

2
votes

Vous devriez essayer de faire en sorte que vos requêtes SQL dépendent de la disposition exacte de la table le moins possible.

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.

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.

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.

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.


0 commentaires

1
votes

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:

  • Vos requêtes sont stables pour les changements dans la commande de la colonne, de sorte que la maintenance prend moins de travail.
  • La colonne commande de la carte est meilleure pour la façon dont les gens pensent, donc c'est plus lisible. Il est plus clair de penser à une colonne comme colonne "Nom" plutôt que la deuxième colonne.

0 commentaires

1
votes

Je préfère utiliser la syntaxe de type mise à jour: xxx

qui est beaucoup plus facile à lire et à entretenir que les exemples.


3 commentaires

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.



1
votes

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.


0 commentaires

2
votes

Quelque chose qui n'a pas encore été mentionné, c'est que vous recevrez souvent une clé de substitution comme votre PK, avec auto_incrènement (ou quelque chose de similaire) pour attribuer une valeur. Avec le premier, vous devez spécifier quelque chose là-bas - mais quelle valeur pouvez-vous spécifier si cela ne doit pas être utilisé? NULL pourrait être une option, mais cela ne correspond pas vraiment à la prise en compte de la PK serait défini sur pas NULL .

Mais en dehors de cela, l'ensemble "verrouillé à un schéma spécifique" est une raison beaucoup plus importante, imo.


0 commentaires

0
votes

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!).


0 commentaires