Maison > base de données > tutoriel mysql > Comment puis-je incrémenter automatiquement les données sans colonne d'identité à l'aide de ROW_NUMBER() ?

Comment puis-je incrémenter automatiquement les données sans colonne d'identité à l'aide de ROW_NUMBER() ?

DDD
Libérer: 2025-01-04 21:53:40
original
839 Les gens l'ont consulté

How Can I Auto-Increment Data Without an Identity Column Using ROW_NUMBER()?

Incrémentation automatique des données à l'aide de ROW_NUMBER() sans ORDER BY

Lors de l'insertion de données dans une table sans colonne d'identité, il devient nécessaire de trouvez des méthodes alternatives pour incrémenter automatiquement la clé primaire. Une approche couramment utilisée est la fonction ROW_NUMBER(), qui permet une numérotation séquentielle des lignes.

Traditionnellement, la fonction ROW_NUMBER() nécessite une clause ORDER BY pour déterminer l'ordre des lignes. Cependant, il existe des scénarios dans lesquels un champ de commande légitime n'est pas disponible. Pour résoudre ce problème, il existe une solution de contournement qui consiste à utiliser une expression constante arbitraire dans la clause ORDER BY, telle que (SELECT 1).

En combinant cette technique avec la clause OVER(), il devient possible de calculer le numéro de ligne pour chaque ligne sans spécifier d'ordre spécifique :

Row_Number() OVER (ORDER BY (SELECT 1))
Copier après la connexion

Cette expression peut ensuite être utilisée dans une instruction INSERT pour incrémenter automatiquement le numéro principal clé :

INSERT INTO dbo.TargetTable (ID, FIELD)
SELECT
   Row_Number() OVER (ORDER BY (SELECT 1))
      + Coalesce(
         (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)),
         0
      ),
   FieldValue
FROM dbo.SourceTable
WHERE {somecondition};
Copier après la connexion

Cependant, il est important de noter que cette solution de contournement ne garantit pas la préservation de l'ordre d'origine des lignes de SourceTable. En fait, d’autres facteurs peuvent influencer l’ordre final du résultat. En effet, le concept de "non ordonné (d'une manière particulière)" diffère de celui de "conserver l'ordre d'origine".

Par conséquent, l'utilisation d'une colonne d'identité pour l'auto-incrémentation de la clé primaire est généralement considérée comme supérieure au ROW_NUMBER( ) solution de contournement. Cela élimine non seulement le besoin de calculs complexes, mais améliore également la concurrence et l'intégrité des données en garantissant que chaque ligne possède un identifiant unique et non conflictuel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal