web-dev-qa-db-fra.com

SQL Server Modifier le type de données de clé primaire

Je travaille sur SQL Server 2012:

J'ai une table avec une colonne de clé primaire en tant que INT. Je dois changer ceci en unGUID.

Est-ce que je modifie la table et supprime la colonne int en tant que primary key?

Ajoutez la colonneGUIDet définissez-la comme primaire et supprimez l’ancienne colonne INT?

Je vous remercie.

5
Guygar

Vous ne pouvez pas modifier la colonne de clé primaire, à moins que vous ne la supprimiez. Toute opération de modification de son type de données entraînera une erreur ci-dessous.

L'objet 'PK__t1__7D78A4E7' dépend de la colonne 'id'.

La seule option est de 

Clé primaire 1. Drop
2.change le type de données
3.recreate primaire key 

ALTER TABLE t1  
DROP CONSTRAINT PK__t1__3213E83F88CF144D;   
GO  

alter table t1 
alter column id varchar(10) not null

alter table t1 add primary key (id)

Depuis 2012, il existe une clause appelée (DROP_EXISTING = ON) qui simplifie les choses en supprimant l’index clusterisé au stade final et en maintenant l’ancien index disponible pour toutes les opérations .. Mais dans votre cas, cette clause ne fonctionnera pas ..

Donc je recommande 

1.créer une nouvelle table avec le schéma et les index souhaités, avec un nom différent
2.insérer les données de l'ancienne table dans la nouvelle table
3. Enfin, au moment de la commutation, insérez les données accumulées
4.Renommer la table à l'ancien nom de la table

De cette façon, vous pourriez avoir moins de temps d'arrêt

10
TheGameiswar

Voici un script que j'ai écrit pour nous aider à déployer une modification du type de données de colonne de clé primaire. 

Ce script suppose qu'il n'y a pas de contrainte de clé non primaire (par exemple, des clés étrangères) en fonction de cette colonne.

Il comporte quelques contrôles de sécurité car il a été conçu pour être déployé sur différents serveurs (dev, uat, live) sans créer d’effets secondaires si la table était quelque peu différente sur un serveur.

J'espère que ça aidera quelqu'un. S'il vous plaît laissez-moi savoir si vous trouvez quelque chose de mal avant de voter vers le bas. Je suis plus qu'heureux de mettre à jour le script.

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C WITH (NOLOCK) WHERE C.TABLE_CATALOG = '<<DB>>' AND C.TABLE_SCHEMA = 'dbo' AND C.TABLE_NAME = '<<Table>>' 
AND C.COLUMN_NAME = '<<COLUMN>>' AND C.DATA_TYPE = 'int') -- <- Additional test to check the current datatype so this won't make unnecessary or wrong updates
BEGIN
    DECLARE @pkName VARCHAR(200);
    SELECT @pkName = pkRef.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pkRef WITH (NOLOCK)
    WHERE pkRef.TABLE_CATALOG = '<<DB>>' AND pkRef.TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '<<Table>>'

    IF(@pkName IS NOT NULL)
    BEGIN
        -- Make sure the primary key name is the one you are going to use in script beyond this point.
        IF(@pkName != '<<PRIMARY KEY NAME>>') 
        BEGIN
            RAISERROR ('Unexpected primary key name - The primary key found has a different name than expected. Please update the script.', 16, 1);
            RETURN;
        END

        ALTER TABLE dbo.<<Table>>
              DROP CONSTRAINT <<PRIMARY KEY NAME>>; -- Note: this is not a string or a variable (just type the PK name)
        SELECT 'Dropped existing primary key';
    END

    ALTER TABLE dbo.<<Table>> ALTER COLUMN ID BIGINT
    SELECT 'Updated column type to big int';

    ALTER TABLE dbo.<<Table>>
          ADD CONSTRAINT <<PRIMARY KEY NAME>> PRIMARY KEY CLUSTERED (<<COLUMN>>);
    SELECT 'Created the primary key';
END
ELSE
BEGIN
    SELECT 'No change required.';
END
1
Menol

Vous pouvez modifier le type de date de la clé primaire en trois étapes.

Étape 1: - Supprimez la contrainte associée à la clé primaire.

ALTER TABLE table_name
 DROP CONSTRAINT constraint_name;

Étape 2: - Modifiez la colonne de clé Primay en un type de données de clé primaire valide. 

ALTER TABLE  table_name
ALTER COLUMN pk_column_name target_data_type(size) not null;

Étape 3: - Créez à nouveau la clé primaire de la colonne modifiée

ALTER TABLE table_name
ADD PRIMARY KEY (pk_column_name);

PS: - 

  • Vous pouvez obtenir le nom de la contrainte du message d'erreur lorsque vous essayez de modifier le pk_column 

  • Si vous avez déjà des données dans pk_column, assurez-vous que les types de données source et cible de la colonne peuvent être utilisés pour les données existantes. sinon, il faudrait deux autres étapes pour déplacer les données existantes dans une colonne temporaire, puis exécuter les étapes et ramener ces données après vérification et suppression de cette colonne temporaire.


1
Sumit Kumar

Dans le tableau, vous voulez changer le type de PK >> Modifier. Allez dans la colonne, changez le type et sauvegardez. Si vous voulez voir le code d'une telle modification, vous pouvez cliquer sur >> "Générer le script de modification .." avant de sauvegarder.

0
Werneck Oliveira