Insérez-les dans une rangée à la position spécifique dans la table SQL server avec PK
Je veux insérer une ligne dans une table SQL server à une position spécifique. Par exemple, pour ma table a 100 lignes et que je veux insérer une nouvelle ligne à la position 9. Mais la colonne ID qui est PK pour la table a déjà une ligne avec l'ID 9. Comment puis-je insérer une ligne à cette position, de sorte que toutes les lignes après la maj vers la position suivante?
OriginalL'auteur user648610 | 2011-08-05
Vous devez vous connecter pour publier un commentaire.
Tables relationnelles ont pas de "poste". Comme un optimisation, un indice de trier les lignes par la clé spécifiée, si vous souhaitez insérer une ligne à un rang spécifique dans la commande de clés, insérez-la avec une clé de tri dans le rang d'une position. Dans votre cas, vous devrez mettre à jour toutes les lignes ayant une valeur si l'ID est supérieur à 8 pour incrémenter ID avec 1, puis insérer l'ID avec la valeur 9:
Inutile de dire, il ne peut pas être sain d'esprit de raison pour faire quelque chose comme ça. Si vous voulez vraiment avoir une telle exigence, alors vous devez utiliser une clé composite avec deux (ou plus) parties. Cette clé vous permettra d'insérer des sous-clés de sorte qu'il trie dans l'ordre souhaité. Mais beaucoup plus probable que votre problème peut être résolu exclusivement par la spécification d'un ORDRE correct, w/o de jouer avec l'ordre physique des lignes.
Une autre façon de le voir est de reconsidérer ce que la clé primaire est à dire: l'identifiant d'une entité, ce qui ne change pas au cours de l'entité à la vie. Votre question peut être reformulée de manière à rendre l'erreur dans votre question la plus évidente:
OriginalL'auteur Remus Rusanu
Non, vous ne pouvez pas contrôler où la nouvelle ligne est insérée. En fait, vous n'avez pas besoin de: l'utilisation de la
ORDER BY
clause sur votreSELECT
déclarations à l'ordre les résultats de la façon dont vous avez besoin.OriginalL'auteur bfavaretto
Habituellement, vous ne pas vous voulez utiliser des clés primaires de cette façon. Un meilleure approche serait de créer une autre colonne appelée "position" ou similaire où vous pouvez garder une trace de votre propre système de commande.
Pour effectuer le déplacement vous pouvez exécuter une requête comme ceci:
Cela ne fonctionne pas si votre colonne utilise auto_increment de la fonctionnalité.
OriginalL'auteur JK.
OriginalL'auteur Srinvias Pothu
Ce genre de viole l'objet d'une table relationnelle, mais si vous avez besoin, ce n'est pas vraiment difficile à faire.
1) utilisation
ROW_NUMBER() OVER(ORDER BY NameOfColumnToSort ASC) AS Row
de faire une colonne pour les numéros de ligne dans votre tableau.2) De là, vous pouvez copier (à l'aide de
SELECT columnsYouNeed INTO
) l'avant et l'après des parties de la table dans deux tableaux distincts (basé sur le numéro de ligne que vous souhaitez insérer vos valeurs après) à l'aide d'unWHERE Row < ##
etRow >= ##
déclaration respectivement.3) Ensuite, vous supprimez la table d'origine à l'aide de
DROP TABLE
.4) Puis vous utilisez un
UNION
pour l'avant de la table, la ligne que vous souhaitez insérer (à l'aide d'un seul explicitement définiSELECT
déclaration sans rien d'autre), et l'après de la table. Maintenant vous avez deuxUNION
consolidés 3 les clauses select. Ici, vous pouvez juste envelopper ce dans unSELECT INTO FROM
clause appelant le nom de votre table d'origine.5) enfin, vous
DROP TABLE
les deux tables que vous avez fait.Ceci est similaire à la façon dont un
ALTER TABLE
œuvres.OriginalL'auteur
POUR PLUS D'REF: https://www.techonthenet.com/sql/insert.php
OriginalL'auteur Er. Binod Mehta