为什么修改一个正在被客户读写的表结构会出错?

Dingnifei123 2010-07-17 06:28:05

-- tbTest表里大概有20W条记录,已有字段超过150个,
-- 现需要往此表中增加以下两字段,结果导致客户端超时,并且,下面两个语句运行了大概6分钟

alter table tbTest
add colTest numeric(18,0) not null default(0)
GO
alter table tbTest
add ncColName nchar(10) not null default(N'N/A')
GO

-- 为什么会出现这种情况,有什么解决办法?
...全文
157 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dingnifei123 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 nddavid 的回复:]
应该表被锁定了
[/Quote]
这哥们等于没说,
NDDavid 2010-07-20
  • 打赏
  • 举报
回复
应该表被锁定了
dla001 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dingnifei123 的回复:]
引用 15 楼 cxmcxm 的回复:
很多情况下,修改表是先创建一结构与修改结构相同的新表,再将原表记录复制到新表中,删除原表,修改新表名为原表名.提交事务.
20w条记录,复制需要不少时间,建议将客户端等待时间设为0(无限长)试试.

关键是原表的记录在不停地增加,而且客户端不可以停下来等着我改结构,
[/Quote]
写个job晚上不做事的时候执行。
如果是7*24的话,想要没影响,只能用null。
PS:你的机器不怎么样,加个20W的这么慢。
情殇无限 2010-07-19
  • 打赏
  • 举报
回复
像你这种情况最好还是晚上3-5点起来更改表字段,或者你不想半夜三更起来那就写个作业来执行
情殇无限 2010-07-19
  • 打赏
  • 举报
回复
alter table tableA add column 需要表上的Sch-M锁,而客户端如果有事物在插入或修改数据,在没有commit或rollback这前,alter table是无法获取到Sch-M锁的,你可以sp_lock查看锁信息,你会发现自己的spid的status是WAIT。你也可以自己做个试验,一个窗口:
begin tran ;
insert into tableA select '','';
另一个窗口:
alter table tableA add column a int
再开一个窗口用sp_lock查看锁定信息
gold_water 2010-07-19
  • 打赏
  • 举报
回复
网上有代码可以查看是否有锁,可以是使用KILL解锁
dla001 2010-07-19
  • 打赏
  • 举报
回复
会有影响,要等你做完。

功能升级,要进行系统升级。 7*24也会理解吧。
Dingnifei123 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 dla001 的回复:]
写个job晚上不做事的时候执行。
如果是7*24的话,想要没影响,只能用null。
PS:你的机器不怎么样,加个20W的这么慢。
[/Quote]

1、的确是7*24工作的,看来只能用null,然后再update,然后再改为not null;
不知道这样做行不,会不会影响客户?
2、机器是Pentuim D 3.0G + 1G RAM的,是不怎么样,
dodosu 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cxmcxm 的回复:]

很多情况下,修改表是先创建一结构与修改结构相同的新表,再将原表记录复制到新表中,删除原表,修改新表名为原表名.提交事务.
20w条记录,复制需要不少时间,建议将客户端等待时间设为0(无限长)试试.
[/Quote]
了解!~
cxmcxm 2010-07-18
  • 打赏
  • 举报
回复
很多情况下,修改表是先创建一结构与修改结构相同的新表,再将原表记录复制到新表中,删除原表,修改新表名为原表名.提交事务.
20w条记录,复制需要不少时间,建议将客户端等待时间设为0(无限长)试试.
Dingnifei123 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xys_777 的回复:]
如果表上有锁,就没法加字段
[/Quote]

1)、如何判断表上是否有锁?

2)、如果有锁,该如何解除表上锁?
永生天地 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dingnifei123 的回复:]
引用 9 楼 sql77 的回复:
是说修改时,表里面以前的数据的那些行都是 NULL,不是默认值


看清楚了,哥们,我有NOT NULL,

所以,插入新列后其默认值不为null而是default value,
[/Quote]

如果表上有锁,就没法加字段
SQL77 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dingnifei123 的回复:]
引用 9 楼 sql77 的回复:
是说修改时,表里面以前的数据的那些行都是 NULL,不是默认值


看清楚了,哥们,我有NOT NULL,

所以,插入新列后其默认值不为null而是default value,
[/Quote]
就是因为这样,相当于把原表的数据都更新了一遍,更新成默认值,8楼已经说了
具体你可以看执行计划

Dingnifei123 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sql77 的回复:]
是说修改时,表里面以前的数据的那些行都是 NULL,不是默认值
[/Quote]

看清楚了,哥们,我有NOT NULL,

所以,插入新列后其默认值不为null而是default value,
Dingnifei123 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cxmcxm 的回复:]
很多情况下,修改表是先创建一结构与修改结构相同的新表,再将原表记录复制到新表中,删除原表,修改新表名为原表名.提交事务.
20w条记录,复制需要不少时间,建议将客户端等待时间设为0(无限长)试试.
[/Quote]
关键是原表的记录在不停地增加,而且客户端不可以停下来等着我改结构,
999朵玫瑰 2010-07-18
  • 打赏
  • 举报
回复
学习了。。
永生天地 2010-07-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dingnifei123 的回复:]
引用 2 楼 zheninchangjiang 的回复:
允许null,修改列值,修改列
你最好测试一下新增的列即使定义了default,已存在的数据对于新增的列仍然为null值

不会的,

经测试,如果定义了default值,插入新列后即是default值,不是如你所说的null值。

我的是mssql server2005 standard editon/win2k3 sta……
[/Quote]
支持
SQL77 2010-07-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dingnifei123 的回复:]
引用 2 楼 zheninchangjiang 的回复:
允许null,修改列值,修改列
你最好测试一下新增的列即使定义了default,已存在的数据对于新增的列仍然为null值

不会的,

经测试,如果定义了default值,插入新列后即是default值,不是如你所说的null值。

我的是mssql server2005 standard editon/win2k3 sta……
[/Quote]
是说修改时,表里面以前的数据的那些行都是 NULL,不是默认值

DROP TABLE TB
GO
CREATE TABLE TB(ID INT DEFAULT 1)
GO

INSERT TB VALUES(DEFAULT)
GO

SELECT * FROM TB
GO
ALTER TABLE TB ADD NAME VARCHAR DEFAULT 'A'

GO

SELECT * FROM TB

/*
(所影响的行数为 1 行)

ID
-----------
1

(所影响的行数为 1 行)

ID NAME
----------- ----
1 NULL

(所影响的行数为 1 行)
SQL77 2010-07-17
  • 打赏
  • 举报
回复
tbTest表里大概有20W条记录,已有字段超过150个,


每条记录都得添加一个列,而且都要插入一个值,等于是更新
Dingnifei123 2010-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zheninchangjiang 的回复:]
允许null,修改列值,修改列
你最好测试一下新增的列即使定义了default,已存在的数据对于新增的列仍然为null值
[/Quote]
不会的,

经测试,如果定义了default值,插入新列后即是default值,不是如你所说的null值。

我的是mssql server2005 standard editon/win2k3 standard edition.
加载更多回复(6)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧