2010-05-25 7 views
1

J'ai une table qui doit recevoir une nouvelle clé primaire, car mon prédécesseur a utilisé une ligne varchar (8) comme clé primaire, et nous avons maintenant des problèmes avec elle. Je sais comment ajouter la clé primaire, mais je ne suis pas sûr de la manière correcte d'ajouter cette nouvelle clé primaire à d'autres tables qui ont la clé étrangère. Voici ce que j'ai:SQL Server ajoute la clé primaire

users table: 
    old_user_id varchar(8) 
    ... 
    ... 
    new_user_id int 

orders table: 
    order_id  int 
    ... 
    ... 
    old_user_fk  varchar(8) 
    new_user_fk  int(11) 

Je dois obtenir les mêmes résultats si je rejoins les tables sur users.old_user_id=orders.old_user_fk ou users.new_user_id=orders.new_user_fk. Toute aide est appréciée.

Répondre

1

Qu'est-ce que int (11)? SQL Server a seulement tinyint, smallint, int et bigint

Je vous suggère d'ajouter les nouvelles colonnes à toutes les tables, puis de mettre à jour les valeurs afin qu'elles correspondent. Exécutez quelques requêtes pour vous assurer que tout fonctionne bien. . laisser tomber les contraintes PK et FK et ajouter de nouvelles contraintes PK et FK en utilisant les nouvelles colonnes

bien sûr, je sauvegarderait toutes ces tables juste au cas où

select * into backup_ orders from orders 

De cette façon, vous avez toujours que les données dans le cas où vous besoin de reculer

+0

désolé, juste eu récemment pour revenir au serveur SQL de MySQL lol –

1

Remplacez votre varchar par int, ne gardez pas les doublons dans la même table.

Ecrire une TSQL similaire ce code je récemment:

BEGIN TRANSACTION 

-- temp tables to hold data 
DECLARE @HeaderTemp table 
     (vid varchar(8), 
     [Name] varchar (50)) 

DECLARE @SecondaryTemp table 
    (vid_fk varchar(8), 
    [Value] varchar (50)) 

-- store table data   
INSERT INTO @HeaderTemp 
    SELECT * FROM [Header] 

INSERT INTO @SecondaryTemp 
    SELECT * FROM [Secondary] 

-- empty data from tables 
DELETE FROM [Secondary] 
DELETE FROM [Header] 

-- drop constraints 
ALTER TABLE [SECONDARY] DROP CONSTRAINT [FK_SECONDARY_HEADER] 
ALTER TABLE [dbo].[HEADER] DROP CONSTRAINT [PK_HEADER] 

-- convert varchar to int 
ALTER TABLE [SECONDARY] ALTER COLUMN VID_FK INT NOT NULL 
ALTER TABLE [HEADER] ALTER COLUMN VID INT NOT NULL 

-- re-create constraints 
ALTER TABLE [dbo].[HEADER] ADD CONSTRAINT [PK_HEADER] PRIMARY KEY CLUSTERED 
(
[vid] ASC 
)  
ALTER TABLE [dbo].[SECONDARY] WITH CHECK ADD CONSTRAINT [FK_SECONDARY_HEADER] 
    FOREIGN KEY([vid_fk]) REFERENCES [dbo].[HEADER] ([vid]) 

-- put data back 
INSERT INTO [Header] 
    SELECT * FROM @HeaderTemp 

INSERT INTO [Secondary] 
    SELECT * FROM @SecondaryTemp 

COMMIT TRANSACTION 
Questions connexes