2014-01-24 6 views
1

У меня есть таблица SMTP (упрощенный)Alter таблицы путем добавления нового столбца, значение которого зависит от другого столбца

ИСХОДНЫЙ ЭТАП

 
| Id | Server  | ConnectionRequired | 
--------------------------------------------- 
| 0 | smtp.tea.com |  '1'   | 
| 1 | smtp.juice.com |  '0'   | 
| 2 | smtp.coffee.com |  NULL  | 
| 3 | smtp.milk.org |  '1'   | 

ConnectionRequired является CHAR(1)

Я пытаемся добавить:

ConnectionType тип е INT

начальное значение которого зависит от ConnectionRequired:

'1' becomes 1 otherwise it becomes 0 

СРЕДНИЙ ЭТАП

 
| Id | Server  | ConnectionRequired | ConnectionType | 
-------------------------------------------------------------- 
| 0 | smtp.tea.com |  '1'   |  1  | 
| 1 | smtp.juice.com |  '0'   |  0  | 
| 2 | smtp.coffee.com |  NULL  |  0  | 
| 3 | smtp.milk.org |  '1'   |  1  | 

ТОГДА Я хочу DROPConnectionRequired

ЗАКАНЧИВАЮЩИЙСЯ ЭТАП

 
| Id | Server  | ConnectionType | 
----------------------------------------| 
| 0 | smtp.tea.com |  1  | 
| 1 | smtp.juice.com |  0  | 
| 2 | smtp.coffee.com |  0  | 
| 3 | smtp.milk.org |  1  | 

То, что я до сих пор:

ALTER TABLE SMTP ADD ConnectionType INT NOT NULL 

    MIDDLE STAGE.... HAPPENS HERE 

ALTER TABLE SMTP DROP COLUMN ConnectionRequired 
+0

так что вам просто нужно «вычисление» на некоторое время, но удалить «исходный столбец» после вычисления? –

+0

Используете ли вы SQL Server или Oracle? –

+0

@AaronBertrand и – gtgaxiola

ответ

1

и работает на обоих (сервер Sql и Oracle)

update smtp set connectionType = (case when connectionRequired = '1' then 1 else 0 end); 
+1

@gtgaxiola так, из любопытства, как это могло работать, если вы сделали это после того, как «ALTER TABLE SMTP ADD ConnectionType INT NOT NULL'? Это не могло работать так, как есть (Msg 4901). –

1

Вы ищете средней стадии? Если да, я бы попробовал

обновление smtp set connectionType = decode (connectionRequired, '1', 1, 0);

0

Вы не можете использовать not null на новый столбец, если таблица содержит данные. Вам нужно будет создать его, сначала разрешив null, затем запустив «средний этап», а затем изменив ненулевое ограничение. Но это не удастся, поскольку в ConnectionRequired есть нули. Как вы хотите справиться с этим?

Для средней стадии: использование

update SMTP set ConnectionType = cast(ConnectionType as int) 

Это будет конвертировать '1' (полукокс) в 1 (INT), '0' (полукокс) в 0 (INT) и NULL (полукокс) в NULL (целое) ,

1

Добавить новый столбец со следующим инструктором.

ALTER TABLE Table_Name 
ADD ConnectionType INT 

Обновить колонку со следующей информацией.

UPDATE Table_Name 
SET ConnectionType = CASE WHEN ConnectionRequired = '1' 
         THEN 1 ELSE 0 END 
1

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

Дано:

CREATE TABLE dbo.SMTP 
(
    Id INT PRIMARY KEY, 
    [Server] NVARCHAR(256), 
    ConnectionRequired CHAR(1) 
); 

INSERT dbo.SMTP VALUES 
(0,'smtp.tea.com ','1'), 
(1,'smtp.juice.com ','0'), 
(2,'smtp.coffee.com',NULL), 
(3,'smtp.milk.org ','1'); 

Тогда вы можете просто обновить данные первого (для устранения NULL с):

UPDATE dbo.SMTP SET ConnectionRequired = '0' WHERE ConnectionRequired IS NULL; 

решить Кроме того, что вы хотите сделать для любых строк, где данные не '0' или '1':

SELECT * FROM dbo.SMTP WHERE ConnectionRequired NOT IN ('0','1'); 
-- UPDATE ... 

Затем измените типа данных и допустимость пустой:

ALTER TABLE dbo.SMTP ALTER COLUMN ConnectionRequired INT NOT NULL; 

И переименовать столбец:

EXEC sp_rename N'dbo.SMTP.ConnectionRequired', N'ConnectionType', N'COLUMN'; 
Смежные вопросы