2012-09-01 38 views
0

我想通过将一个表拆分为两个来重构我的数据库。我想将一些现有的列移动到一个新表中。例如,假设我想将以下Employee表中的address字段移动到新的Address表中。如何将一列中的列移动到新表中?

如何使用sqlite(或SQL,如果有的话)完成这个

前:

Employee Table 
    employee_id (Primary) 
    name 
    address 
    city 

后:

Employee Table 
    employee_id (Primary) 
    name 
    address_id 

Address Table 
    address_id (Primary) 
    address 
    city 
+0

你可以提供一些关于地址ID的细节吗? – heretolearn

回答

1

试试这个:

CREATE TABLE Employee(
    emp_id int, 
    name nvarchar(50), 
    address nvarchar(50), 
    city nvarchar(50), 
    PRIMARY KEY (emp_Id)); 

ALTER TABLE Employee 
ADD address_id int NOT NULL IDENTITY; 

INSERT INTO EMPLOYEE(emp_id,name,address,city) VALUES (111,'JOHN','XXX STREET','XYZ'); 

CREATE TABLE Address(
    address_id int NOT NULL, 
    address nvarchar(100), 
    city nvarchar(100), 
    PRIMARY KEY (address_id) 
); 

INSERT INTO Address (address_id, address, city) 
SELECT address_id, address, city 
FROM Employee; 

ALTER TABLE Employee 
DROP COLUMN address; 

ALTER TABLE Employee 
DROP COLUMN city; 

检查here

+0

'address_id'是每个地址行的新主键。 –

+0

该值应该是自动递增或由用户输入..? – heretolearn

+0

自动生成很好,我认为这是从上下文隐含的 - 我只是将表分成两部分。 –

0

1:创建您的第一个表中的列AddressID并分配一个号码。
2:创建新表为空。
3:传输数据(像这样)
INSERT INTO ADDRESS(ADDRESS_ID,地址,城市)
SELECT ADDRESS_ID,地址,城市FROM EMPLOYEE
4:从第一个表中删除旧列并创建外键

1
create table employee_new(employee_id,name,address_id); 
insert into employee_new select employee_id,name,employee_id from employee; 
create table address(address_id,address,city); 
insert into address select employee_id,address,city from employee; 
alter table employee rename to employee_old; 
alter table employee_new rename to employee; 
+0

您可以在迁移中无耻地使用employee_id的值作为address_id,将来您当然不能相信它们是相同的。这里的语法符合sqlite(跳过数据类型)。 – Toni

+0

感谢托尼,我实际上不能依赖这个,因为在实际使用这个代码时,我实际上会为每个员工创建多个地址。您是否希望我发布新的跟进问题或修改现有问题以提及此问题? –

+0

修改这是好的。你在哪里得到新的地址? Employee表中每个employee_id现在有多行? – Toni

相关问题