new*_*ser 3 sql-server primary-key
我创建了一个表State,我的另一个表Addresses引用了该表。
CREATE TABLE State
(
StateId varchar(20) PRIMARY KEY NOT NULL,
Text varchar(40) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
我想将其主键更改为int
and IDENTITY(1,1)
,但是,我无法删除它,因为它是另一个表的外键。如何更新它而不必重新创建所有内容?
您不能更改关键字段(主要或外来)的数据类型。如果该字段用于索引,您甚至无法更改数据类型。所以...
ALTER TABLE [State] DROP COLUMN [StateID];
ALTER TABLE [State] ADD [StateID] INT IDENTITY(1, 1) NOT NULL;
ALTER TABLE [Addresses] ALTER COLUMN [StateID] INT NOT NULL;
ALTER TABLE [State] ADD [StateID2] INT IDENTITY(1, 1) NOT NULL;
ALTER TABLE [Addresses] ADD [StateID2] INT NOT NULL CONSTRAINT [DF_Addresses_StateID2] DEFAULT (0);
更新 [Addresses] 表以匹配 [State] 表中的新 ID
UPDATE addr
SET addr.StateID2 = st.StateID2
FROM Addresses addr
INNER JOIN [State] st
ON st.StateID = addr.StateID
Run Code Online (Sandbox Code Playgroud)ALTER TABLE [Addresses] DROP CONSTRAINT [DF_Addresses_StateID2];
如果没有维护窗口,那么您不仅要处理表上的争用(并且添加/删除字段需要 SCHEMA 锁),还需要更新将数据添加到 [Addresses] 的进程
有关这种“无维护窗口”方法的更详细说明,请参阅我在 SQL Server Central 上写的关于它的文章(需要免费注册):Restructure 100 Million Row (or more) Tables in Seconds。SRSLY!
归档时间: |
|
查看次数: |
30328 次 |
最近记录: |