2014-01-24 32 views
1

我有一個表SMTP(簡化的)通過將其值依賴於另一列

初始階段

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

ConnectionRequiredCHAR(1)

我是一個新列變更表試圖增加:

ConnectionType typ Ë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 Server和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

您是否在尋找中期階段?如果是這樣,我會嘗試

update smtp set connectionType = decode(connectionRequired,'1',1,0);

0

如果表中包含的數據不能在一個新列使用not null上工作。您必須首先創建它,然後運行「中間階段」,然後更改非空約束。但是這將會失敗,因爲ConnectionRequired中有空值。你想如何處理這些?

對於中期階段:使用

update SMTP set ConnectionType = cast(ConnectionType as int) 

這將轉換'1'(炭),以1(INT),'0'(炭),以0(INT),和NULL(炭),以NULL(INT) 。

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 S):

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';