Utilisation de ROW_NUMBER() sans ORDER BY pour l'incrémentation automatique dans SQL Server 2005
Dans SQL Server 2005, incrémentation automatique d'un non- La colonne d'identité peut être difficile lorsque vous travaillez avec ROW_NUMBER() et en l'absence d'un critère ORDER BY approprié. Cependant, il existe des alternatives :
Utiliser ROW_NUMBER() avec une clause Order By constante :
Bien qu'il manque un champ ORDER BY valide, ROW_NUMBER() peut être combiné avec une clause de commande constante pour imiter l'auto-incrémentation :
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};
Cette méthode évite l'ordre explicite tout en garantissant l'unicité dans la colonne ID.
Mise en garde : Non-garantie de la commande originale :
Il est crucial de noter que cette approche ne garantit pas la préservation de la commande SourceTable originale. D'autres facteurs, tels que ORDER BY d'une requête externe, peuvent influencer l'ordre des résultats.
Considérations relatives à la concurrence :
Des conseils de verrouillage (TABLOCKX et HOLDLOCK) sont inclus dans le requête pour empêcher les processus simultanés d’insérer le même ID entre les étapes d’exécution de la requête. Cependant, cette approche n'est pas aussi efficace que l'utilisation d'une colonne d'identité et ne doit être considérée que comme une solution de contournement.
Solution recommandée : utilisez la colonne d'identité :
Pour des performances et des performances optimales. concurrence, il est fortement recommandé d'utiliser une colonne d'identité pour l'auto-incrémentation.
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!