2013-07-14 67 views
1

我有一個源(網頁),它具有我需要存儲在一個表中的公用數據和罕見數據。按不同的列創建表插入

的數據可以是這樣的:

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

就像你不能吃你的蛋糕,仍然有它,你不能讓簡單和不規範它。 – mvp

回答

1

有一個非常簡單的解決這個。你需要改變你的表:

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

然後當你做INSERT,你會怎麼做:

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

這是一個標準化的表結構,允許n量的屬性。

0

如果您使用陣列來獲取數據,那麼您可以使用PHP的implode(', ', $array)。但是,您可能沒有使用PHP。如果是這種情況,你總是可以連接。

0

正確的解決方案是規範你的模式。

創建2個表:主模型的主表 - 幾乎你現在擁有的,但沒有屬性,並且從表保留屬性。類似這樣的:

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 ... 
相關問題