locked
Modifier la Clé Primaire sur SQL SERVER 2008 Management Studio RRS feed

  • Question

  • Bonjour,

    Comment modifier la clé primaire d'une table actuellement en type nchar(15) pour la passer en type Identfierunique avec incrément automatique ?
    mercredi 15 juillet 2009 17:47

Réponses

  • Bonjour,

    Il y a-t-il des tables qui référencent (clé étrangère) la table dont tu souhaite modifier la clé primaire?

    Si oui, il faut au préalable supprimer ces références, modifier ensuite supprimer la clé primaire, modifier la nature du champ et ajouter la clé primaire puis enfin recréer les clés étrangère sur la table en prenant soin d'avoir changé les types dans les tables étrangères.

    ALTER TABLE NomDeMaTable DROP CONSTRAINT PK_NomDeMaTable
    GO
    ALTER TABLE NomDeMaTable ALTER COLUMN NomColonne int NOT NULL
    GO
    ALTER TABLE NomDeMaTable ADD CONSTRAINT PK_NomDeMaTable PRIMARY KEY CLUSTERED 
    	(
    		NomColonne
    	)
    GO
    

    Pour le coté Identity, ce n'est pas faisable à ma connaissance. Le Wizard SSMS crée une table temporaire, transvase les données supprime l'ancienne table et la renomme la nouvelle. Je te conseille donc d'utiliser SSMS pour le faire.

    En espérant avoir pu t'aider,

    t0x1
    • Proposé comme réponse t0x1 mercredi 22 juillet 2009 08:02
    • Marqué comme réponse Marius Bugiulescu vendredi 31 juillet 2009 15:40
    mercredi 22 juillet 2009 07:53
  • Bonjour,
    Il semble que l'Assistant crée une autre table et copie les enregistrements de l'ancienne.
    C'est le code qu'il génère pour une table simple:

    BEGIN TRANSACTION
    GO
    CREATE TABLE dbo.Tmp_testTable1
    	(
    	ID int NOT NULL IDENTITY (1, 1),
    	data1 date NULL
    	)  ON [PRIMARY]
    GO
    ALTER TABLE dbo.Tmp_testTable1 SET (LOCK_ESCALATION = TABLE)
    GO
    SET IDENTITY_INSERT dbo.Tmp_testTable1 ON
    GO
    IF EXISTS(SELECT * FROM dbo.testTable1)
    	 EXEC('INSERT INTO dbo.Tmp_testTable1 (ID, data1)
    		SELECT CONVERT(int, ID), data1 FROM dbo.testTable1 WITH (HOLDLOCK TABLOCKX)')
    GO
    SET IDENTITY_INSERT dbo.Tmp_testTable1 OFF
    GO
    DROP TABLE dbo.testTable1
    GO
    EXECUTE sp_rename N'dbo.Tmp_testTable1', N'testTable1', 'OBJECT' 
    GO
    COMMIT
    

    Cordialement,
    Marius
    vendredi 31 juillet 2009 15:38

Toutes les réponses

  • Bonjour,

    Il y a-t-il des tables qui référencent (clé étrangère) la table dont tu souhaite modifier la clé primaire?

    Si oui, il faut au préalable supprimer ces références, modifier ensuite supprimer la clé primaire, modifier la nature du champ et ajouter la clé primaire puis enfin recréer les clés étrangère sur la table en prenant soin d'avoir changé les types dans les tables étrangères.

    ALTER TABLE NomDeMaTable DROP CONSTRAINT PK_NomDeMaTable
    GO
    ALTER TABLE NomDeMaTable ALTER COLUMN NomColonne int NOT NULL
    GO
    ALTER TABLE NomDeMaTable ADD CONSTRAINT PK_NomDeMaTable PRIMARY KEY CLUSTERED 
    	(
    		NomColonne
    	)
    GO
    

    Pour le coté Identity, ce n'est pas faisable à ma connaissance. Le Wizard SSMS crée une table temporaire, transvase les données supprime l'ancienne table et la renomme la nouvelle. Je te conseille donc d'utiliser SSMS pour le faire.

    En espérant avoir pu t'aider,

    t0x1
    • Proposé comme réponse t0x1 mercredi 22 juillet 2009 08:02
    • Marqué comme réponse Marius Bugiulescu vendredi 31 juillet 2009 15:40
    mercredi 22 juillet 2009 07:53
  • Bonjour,
    Il semble que l'Assistant crée une autre table et copie les enregistrements de l'ancienne.
    C'est le code qu'il génère pour une table simple:

    BEGIN TRANSACTION
    GO
    CREATE TABLE dbo.Tmp_testTable1
    	(
    	ID int NOT NULL IDENTITY (1, 1),
    	data1 date NULL
    	)  ON [PRIMARY]
    GO
    ALTER TABLE dbo.Tmp_testTable1 SET (LOCK_ESCALATION = TABLE)
    GO
    SET IDENTITY_INSERT dbo.Tmp_testTable1 ON
    GO
    IF EXISTS(SELECT * FROM dbo.testTable1)
    	 EXEC('INSERT INTO dbo.Tmp_testTable1 (ID, data1)
    		SELECT CONVERT(int, ID), data1 FROM dbo.testTable1 WITH (HOLDLOCK TABLOCKX)')
    GO
    SET IDENTITY_INSERT dbo.Tmp_testTable1 OFF
    GO
    DROP TABLE dbo.testTable1
    GO
    EXECUTE sp_rename N'dbo.Tmp_testTable1', N'testTable1', 'OBJECT' 
    GO
    COMMIT
    

    Cordialement,
    Marius
    vendredi 31 juillet 2009 15:38