我有一个源(网页),它包含我需要存储在一个表中的公共数据和非常见数据。
数据可能如下所示:
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
答案 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 ...