SQL Server добавить первичный ключ - PullRequest
1 голос
/ 25 мая 2010

У меня есть таблица, которой нужно дать новый первичный ключ, так как мой предшественник использовал строку varchar (8) в качестве первичного ключа, и у нас сейчас с этим проблемы. Я знаю, как добавить первичный ключ, но я не уверен в правильном способе добавления этого нового первичного ключа в другие таблицы с внешним ключом. Вот что у меня есть:

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)

Мне нужно получить одинаковые результаты, независимо от того, присоединяюсь ли я к таблицам на users.old_user_id=orders.old_user_fk или users.new_user_id=orders.new_user_fk. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 25 мая 2010

Замените ваш varchar на int, не храните дубликаты в одной таблице.

Напишите несколько TSQL, похожих на этот код, который я использовал недавно:

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
1 голос
/ 25 мая 2010

Что такое int (11)? SQL Server имеет только tinyint, smallint, int и bigint

Я бы посоветовал вам добавить новые столбцы во все таблицы, а затем обновить значения, чтобы они соответствовали .... выполнить несколько запросов, чтобы убедиться, что все работает. удалите ограничения PK и FK и добавьте новые ограничения PK и FK, используя новые столбцы

конечно, я бы сделал резервную копию всех этих таблиц на всякий случай

select * into backup_ orders from orders

Таким образом, у вас всегда есть эти данные на случай отката

...