如何从平面表创建关系表?

时间:2017-04-26 16:17:47

标签: sql sqlite

我有这个输入表:

CREATE TABLE `data` ( 
   `id` INTEGER, 
   `a`  INTEGER, 
   `b` INTEGER, 
   `c` TEXT, PRIMARY KEY(`id`) )

有了这些数据:

id a b c
-- - - -
 1 1 4 a
 2 1 5 a
 3 1 6 b
 4 2 4 a
 5 1 5 c

由于我在此表上有许多其他列bc,...以及大量冗余。例如,我们看到条目1与条目4相同,所以我想从这个平面表创建关系表,最终放弃data以支持我的两个新表和创建名为view

data

目标是使用以下内容创建两个表bca

a                  bc
--------           --
id id_bc           id b c
-- -----           -- - -
 1 1               1  4 a
 2 2               2  5 a
 3 3               3  6 b
 4 1               4  4 c
 5 4

通过以下方式轻松获取bc

CREATE TABLE bc AS SELECT DISTINCT b,c FROM data

但我不知道如何:

  1. 使用bc
  2. 创建id
  3. 创建与a
  4. 有外国关系的bc

1 个答案:

答案 0 :(得分:1)

如果要自定义表bc的创建,请执行此操作,而不是使用create table ... as select。 (或者,将行标识符称为rowid,而不是为其指定自定义名称。)

create table bc(
    id integer primary key,
    b integer,
    c integer)

insert into bc(b,c) select distinct b,c from data

对于a,由于您需要外键,因此无法使用create table ... as select

create table a(
    id integer primary key,
    id_bc integer,
    foreign key (id_bc) references bc(id))

insert into a(id_bc)
select bc.id from data inner join bc
  on data.b = bc.b and data.c = bc.c

在每个insert语句中省略主键(或指定null)将使用autoincrement。