Изменение типа данных столбца, на который ссылаются другие таблицы - PullRequest
2 голосов
/ 26 января 2012

Я хочу изменить тип данных столбца первичного ключа в таблице A, на которую ссылается таблица B. Схема выглядит примерно так:

Таблица A: (номер col1A, номер col2A ...) Таблица B: (номер col1B, номер col2B ...)

col2B -> col1A

Я хочу изменить тип данных col1A с номера на varchar. Я хочу, чтобы это также было отражено в таблице В. Есть ли простой способ сделать это?

- Спасибо.

Ответы [ 2 ]

4 голосов
/ 26 января 2012

Нет, простого способа сделать это не существует. Предполагая, что в обеих таблицах есть данные, вам нужно

  • Добавить новый столбец VARCHAR2 в таблицу A
  • Обновить A, чтобы установить новый столбец равным TO_CHAR( col1A )
  • Добавить новый столбец 'VARCHAR2` в таблицу B
  • Обновить B, чтобы установить столбец равным TO_CHAR( col2B )
  • Удалить существующее ограничение внешнего ключа
  • Удалить существующее ограничение первичного ключа
  • Дроп col1A от А
  • Дроп col2B от B
  • Переименуйте новые столбцы (при желании) в A & B в col1A и col2B
  • Создать новое ограничение первичного ключа
  • Создать новое ограничение внешнего ключа

Очевидно, это будет довольно дорогая операция.

1 голос
/ 14 июля 2015

Это подтверждение концепции в T-SQL (SQL Server). В основном мы меняем тип данных первичного ключа с INT на UNIQUEIDENTIFIER (GUID) в таблице A, на который ссылается внешний ключ в таблице B.

-- ARRANGE

CREATE TABLE A(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    CONSTRAINT PK_A PRIMARY KEY (Id)
)

CREATE TABLE B(
    [Id] INT IDENTITY(1,1) NOT NULL,
    [A_Id] INT NOT NULL,
    CONSTRAINT PK_B PRIMARY KEY (Id),
    CONSTRAINT FK_B_A FOREIGN KEY (A_Id) REFERENCES A(Id)
)

INSERT A DEFAULT VALUES

DECLARE @A_Id INT
SELECT @A_Id = SCOPE_IDENTITY()

INSERT INTO B VALUES (@A_Id)
INSERT INTO B VALUES (@A_Id)
INSERT INTO B VALUES (@A_Id)
INSERT INTO B VALUES (@A_Id)
INSERT INTO B VALUES (@A_Id)

-- ACT

ALTER TABLE A ADD New_Id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() 
ALTER TABLE B ADD New_A_Id UNIQUEIDENTIFIER NULL
UPDATE B SET B.New_A_Id = (SELECT A.New_Id FROM A WHERE A.Id = B.A_Id)

ALTER TABLE B DROP FK_B_A
ALTER TABLE B DROP COLUMN A_Id
EXEC sp_RENAME 'B.New_A_Id', 'A_Id', 'COLUMN'

ALTER TABLE A DROP PK_A
ALTER TABLE A DROP COLUMN Id
ALTER TABLE A ADD CONSTRAINT PK_A PRIMARY KEY (New_Id)
EXEC sp_RENAME 'A.New_Id', 'Id', 'COLUMN'

ALTER TABLE B ADD CONSTRAINT FK_B_A FOREIGN KEY (A_Id) REFERENCES A(Id)

-- ASSERT

SELECT * FROM A
SELECt * FROM B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...