通过不同的列插入创建表

时间:2013-07-14 21:20:02

标签: mysql sql dml

我有一个源(网页),它包含我需要存储在一个表中的公共数据和非常见数据。

数据可能如下所示:

model: xyz, attr_1: xyz, attr_2: xyz
model: xyz, attr_3: xyz, attr_4: xyz
model: xyz, attr_1: xyz, attr_4: xyz
model: xyz, attr_1: xyz, attr_5: xyz
model: xyz, attr_15: xyz, attr_20: xyz

此数据将生成此DML:

insert into table (model, attr_1, attr_2)values('xyz','xyz','xyz');
insert into table (model, attr_3, attr_4)values('xyz','xyz','xyz');
insert into table (model, attr_1, attr_4)values('xyz','xyz','xyz');
insert into table (model, attr_1, attr_5)values('xyz','xyz','xyz');
insert into table (model, attr_15, attr_20)values('xyz','xyz','xyz');

我的问题是我无法在insert命令之前定义表,因此我无法知道列,并且在每个新插入中我都可能发现新列。在实际插入之前,我无法获取所有插入命令。我唯一想到的是将每一行插入到不同的表中(使用create table as insert into),然后使用UNION ALL创建最终表。但这听起来并不是一个好主意。

编辑我不寻找规范化的表格。

最终结果应该是(例如):

table_name
id       int
model    varchar
attr_1   varchar
attr_2   varchar
attr_3   varchar
attr_4   varchar
attr_5   varchar
attr_15  varchar
attr_20  varchar

3 个答案:

答案 0 :(得分:1)

这是一个非常简单的解决方案。你需要改变你的表:

table: model
modelName attribute value
xyz       1          xyz
xyz       2          xyz

然后当你执行INSERT时,你会这样做:

INSERT INTO `model` (`modelName`, `attribute`, `value`) VALUES ('xyz', 1, 'xyz')

这是一个规范化的表结构,允许n个属性。

答案 1 :(得分:0)

如果您使用数组来获取数据,那么您可以使用PHP的implode(', ', $array)。但是,您可能没有使用PHP。如果是这种情况,您可以随时连接INSERT,的内容。

答案 2 :(得分:0)

正确的解决方案是规范化您的架构。

创建2个表:主模型的主表 - 几乎就是你现在拥有的,但是没有属性,而slave表来保存属性。像这样:

CREATE TABLE master (
    master_id INTEGER PRIMARY KEY AUTOINCREMENT,
    model VARCHAR(50)
);

CREATE TABLE attrs (
    attr_id INTEGER PRIMARY KEY AUTOINCREMENT,
    master_id INTEGER NOT NULL,
    attr_name VARCHAR(20)
);

此架构相当紧凑,具有一些重要属性。例如,它允许您保留与给定模型关联的任意数量的属性 - 它可以是0,或者可以是1000。

要插入数据,首先需要在主表中插入,然后在attrs表中插入。

要检索数据,请使用以下简单连接:

SELECT m.model,
       a.attr_name
FROM master m
JOIN attrs a ON m.model_id = a.model_id
WHERE ...