SQL:将原始列替换为引用另一个表的列的新列

时间:2012-09-26 18:33:42

标签: sql sql-server sql-server-2008-r2

我有两个表,都已经填充了数据,并且包含以下列:

表1
jobType char
jobDesc varchar

NEW_TABLE
jobID int
jobType char

我想将Table1.jobType替换为jobID列,以便Table1现在使用New_table引用jobIDTable1.jobType中的所有现有数据都必须“翻译”到相应的jobID

2 个答案:

答案 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语句