通过添加其值取决于另一列的新列来更改表

时间:2014-01-24 19:14:34

标签: sql sql-server

我有一个表SMTP(简化)

INITIAL STAGE

| 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

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        |

那我想DROP ConnectionRequired

结束阶段

| 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

5 个答案:

答案 0 :(得分:1)

你在寻找中间阶段吗?如果是这样,我会尝试

更新smtp set connection类型= decode(连接必需,'1',1,0);

答案 1 :(得分:1)

并同时处理(Sql server和Oracle)

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

答案 2 :(得分:1)

使用以下语句添加新列。

ALTER TABLE Table_Name
ADD ConnectionType INT 

使用以下语句更新列。

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

答案 3 :(得分: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';

答案 4 :(得分:0)

如果表包含数据,则不能在新列上使用not null。您必须首先创建它,允许空值,然后运行“中间阶段”,然后更改非空约束。但由于ConnectionRequired中存在空值,因此会失败。你想怎么处理这些?

对于中间阶段:使用

update SMTP set ConnectionType = cast(ConnectionType as int)

这会将'1'(char)转换为1(int),'0'(char)转换为0(int)和NULL(char )到NULL(int)。