我有两个表,都已经填充了数据,并且包含以下列:
表1
jobType char
jobDesc varchar
NEW_TABLE
jobID int
jobType char
我想将Table1.jobType
替换为jobID
列,以便Table1现在使用New_table
引用jobID
。 Table1.jobType
中的所有现有数据都必须“翻译”到相应的jobID
。
答案 0 :(得分:1)
基础练习:
从原始作业表开始
create table dbo.job
(
id int not null identity(1,1) ,
job_type varchar(64) not null ,
job_description varchar(128) not null ,
constraint job_PK primary key clustered (id) ,
)
创建新的作业类型表(不要忘记填充它)
create table dbo.job_type
(
id int not null identity(1,1) ,
name varchar(64) not null ,
constraint job_type_PK primary key clustered ( id ) ,
constraint job_type_AK01 unique nonclustered ( name ) ,
)
更改表dbo.job以添加新的job_type_id列
alter table dbo.job
add job_type_id int null
更新作业表,根据[old] job_type列的值映射job_type_id的值。
update dbo.job
set job_type_id = jt.id
from dbo.job j
join dbo.job_type jt on jt.name = j.job_type
更改新列以使其不可为空。在确保所有行都具有job_type_id的非null值之前,这将失败:
alter table dbo.job
alter column job_type_id int not null
添加所需的新外键约束
alter table dbo.job
add constraint job_AK01
foreign key ( job_type_id )
references dbo.job_type ( id )
最后一个不可撤销的步骤是删除旧列。这将破坏引用此列的任何查询,存储过程等......但您已经在该部门完成了作业并协调了所有必要的更改,对吧?
alter table dbo.job drop column job_type
答案 1 :(得分:0)
如果Table1中JobType列中的数据都是以文本形式存储的Integer值,则运行以下命令:
ALTER TABLE Table1 ALTER COLUMN JobType INT
如果列包含非整数值,例如ABC1,ABC2,那么您首先需要更改列中的数据。使用我在这里使用的示例值,您将运行:
UPDATE Table1
SET JobType = SUBSTRING(JobType,4,1)
然后您可以运行上面的ALTER TABLE语句