Maison >base de données >tutoriel mysql >Comment puis-je incrémenter automatiquement une colonne sans identité dans SQL Server 2005 sans utiliser ORDER BY dans ROW_NUMBER() ?
Éviter ORDER BY dans SQL Server 2005 ROW_NUMBER()
Lors de l'insertion de données d'une table dans une autre, il est souvent souhaitable d'incrémenter automatiquement une colonne de non-identité dans la table cible. Bien que la fonction ROW_NUMBER() puisse être utilisée pour y parvenir, elle nécessite généralement un champ ORDER BY. Cependant, si l'ordre original de la table source doit être conservé, il est nécessaire de trouver une approche alternative.
Une solution qui évite l'ordre explicite implique le code suivant :
INSERT 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};
Ce code utilise une fonction de fenêtre pour calculer les numéros de ligne en fonction d'une valeur constante, remplaçant ainsi le besoin d'une clause ORDER BY. De plus, pour éviter les problèmes de concurrence, la requête utilise des indicateurs de verrouillage (TABLOCKX et HOLDLOCK) lors du calcul de la valeur maximale dans la table cible.
Il est important de noter que même si cette approche évite de spécifier explicitement un ordre, elle ne le fait pas. Cela ne garantit pas que l'ordre d'origine de la table source sera préservé. Des facteurs tels que l’ordre des requêtes externes peuvent toujours influencer le résultat. Du point de vue d'une base de données, le concept de « conservation de l'ordre d'origine » n'existe pas vraiment.
Pour une simultanéité et une intégrité des données optimales, l'utilisation d'une colonne d'identité est fortement recommandée pour cette solution de contournement. Le verrouillage exclusif de la table via les indices de verrouillage doit être évité sauf en cas d'absolue nécessité.
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!