我有一个表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' |
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 |
那我想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
答案 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)。