Nous avons une table de 5 Go (près de 500 millions de lignes) et nous voulons supprimer la propriété d'identité sur l'une des colonnes, mais lorsque nous essayons de le faire via SSMS, le délai expire.
Cela peut-il être fait via T-SQL?
sql
sql-server
tsql
Conrad Jagger
la source
la source
Réponses:
Vous ne pouvez pas supprimer une
IDENTITY
spécification une fois définie.Pour supprimer toute la colonne:
Informations sur ALTER TABLE ici
Si vous devez conserver les données, mais supprimer la
IDENTITY
colonne, vous devrez:IDENTITY
colonne existante vers la nouvelle colonneIDENTITY
colonne existante .la source
identity
colonne est utilisée dans le cadre d'unforeign key
dans une autre table, vous devrez d'abord supprimer les contraintes, puis agir comme @AdamWenger l'a mentionné concernant la suppression de l'identité.attribute/property
Vous pouvez également consulter ce lien pour plus de détails. à propos de la suppression de l'attribut uniquement: blog.sqlauthority.com/2009/05/03/… ..Bonne chance!Si vous voulez faire cela sans ajouter et remplir une nouvelle colonne , sans réorganiser les colonnes , et avec presque pas de temps d'arrêt car aucune donnée ne change sur la table, faisons de la magie avec la fonctionnalité de partitionnement (mais comme aucune partition n'est utilisée, vous ne le faites pas. t besoin de l'édition Entreprise):
ALTER TABLE [Original] SWITCH TO [Original2]
exec sys.sp_rename
pour renommer les différents objets de schéma en leur attribuant les noms d'origine, puis vous pouvez recréer vos clés étrangères.Par exemple, étant donné:
Vous pouvez faire ce qui suit:
la source
Cela devient compliqué avec les contraintes de clés étrangères et primaires, alors voici quelques scripts pour vous aider sur votre chemin:
Tout d'abord, créez une colonne en double avec un nom temporaire:
Ensuite, obtenez le nom de votre contrainte de clé primaire:
Maintenant, essayez de supprimer la contrainte de clé primaire pour votre colonne:
Si vous avez des clés étrangères, cela échouera, donc si c'est le cas, supprimez les contraintes de clé étrangère. CONSERVEZ LES TABLES POUR LESQUELLES VOUS FONCTIONNEZ AFIN DE POUVOIR AJOUTER LES CONTRAINTES PLUS TARD !!!
Une fois que toutes vos contraintes de clé étrangère ont été supprimées, vous pourrez supprimer la contrainte PK, supprimer cette colonne, renommer votre colonne temporaire et ajouter la contrainte PK à cette colonne:
Enfin, rajoutez les contraintes FK dans:
El Fin!
la source
Select t.name 'Table', i.name 'Index', c.name 'Column', i.is_primary_key, i.is_unique From sys.tables t Inner Join sys.indexes i On i.object_id = t.object_id Inner Join sys.index_columns ic ON ic.object_id = i.object_id And i.index_id = ic.index_id Inner Join sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id Where t.name = 'tableName' Order By t.name, i.name, i.index_id, ic.index_column_id
J'ai juste eu ce même problème. 4 instructions dans SSMS au lieu d'utiliser l'interface graphique et c'était très rapide.
Créer une nouvelle colonne
alter table users add newusernum int;
Copier les valeurs sur
update users set newusernum=usernum;
Supprimer l'ancienne colonne
alter table users drop column usernum;
Renommez la nouvelle colonne avec l'ancien nom de colonne
EXEC sp_RENAME 'users.newusernum' , 'usernum', 'COLUMN';
la source
Le script suivant supprime le champ d'identité pour une colonne nommée 'Id'
J'espère que ça aide.
la source
Le code ci-dessous fonctionne aussi bien, lorsque nous ne connaissons pas le nom de la colonne d'identité .
Besoin de copier les données dans une nouvelle table temporaire comme
Invoice_DELETED
. et la prochaine fois que nous utiliserons:Pour plus d'explications, voir: https://dba.stackexchange.com/a/138345/101038
la source
Cependant, le code ci-dessus ne fonctionne que si aucune relation de clé primaire-étrangère
la source
Juste pour quelqu'un qui a le même problème que moi. Si vous voulez juste faire une insertion juste une fois, vous pouvez faire quelque chose comme ça.
Supposons que vous ayez une table avec deux colonnes
et que vous voulez insérer une ligne avec l'ID = 4. Vous l'avez donc réensemencée à 3 pour que la suivante soit 4
Faire l'insertion
Et ramenez votre graine à l'ID le plus élevé, supposons que ce soit 15
Terminé!
la source
J'avais la même exigence, et vous pourriez essayer de cette façon, ce que je vous recommande personnellement, veuillez concevoir manuellement votre table et générer le script, et ce que j'ai fait ci-dessous a été de renommer l'ancienne table et aussi sa contrainte de sauvegarde.
la source
Dans SQL Server, vous pouvez activer et désactiver l'insertion d'identité comme ceci:
SET IDENTITY_INSERT nom_table ON
- lancez vos requêtes ici
SET IDENTITY_INSERT nom_table OFF
la source