我有一个有5列的表。 4列将保持不变,只有第5列更改。
a b c d e
v1 v2 v3 v4 v10
v1 v2 v3 v4 v11
v1 v2 v3 v4 v12
v1 v2 v3 v4 v13
v1 v2 v3 v4 v14
v1 v2 v3 v4 v15
v6 v7 v8 v9 v16
v6 v7 v8 v9 v17
v6 v7 v8 v9 v18
v6 v7 v8 v9 v19
v6 v7 v8 v9 v20
前4列始终具有相同的值,只有第5列值会发生变化。
我将列a,b,c,d作为主键并尝试使用collowing语句。
INSERT INTO $tablename( a,b,c,d,e)
VALUES(v1,v2,v3,v4,v5)
ON DUPLICATE KEY UPDATE e = VALUES(e);
我得到的结果是:
a b c d e
v1 v2 v3 v4 v15
我在数据库中尝试的是:
a b c d e
v1 v2 v3 v4 v10
v11
v12
v13
v14
v15
v6 v7 v8 v9 v16
v17
v18
v19
v20
答案 0 :(得分:0)
您不能使主键包含空值。如果(a,b,c,d)是您的主键,则每行必须具有非空值。并且它不能包含所有相同的值,因为主键必须是唯一的。
你误解了INSERT .. ON DUPLICATE KEY UPDATE
的作用。这意味着如果表中已存在一行,您正在尝试插入主键或唯一键,它不会插入新行,而是根据您的行更改现有行SET分配。
听起来你有一对多的关系,你需要第二张桌子。
前4列将用作提取第5列的组合。例如:(a,b,c,d) - > v10通过使用a,b,c,d我试图从v5中提取数据。
我无法理解你的意思。主键不“不仅从”属性列中提取数据,而且还提到v10然后是v5,因此不清楚你在做什么。
答案 1 :(得分:0)
您的主键(abcd)与值(e)之间存在一对多的关系。所以对于每个(abcd)你有很多(e)s。这不能使用一个表来完成,因为在一个表中不能有重复的主键。
基本上你需要创建(至少)两个表而不是一个,即:
表1:a,b,c,d,i1(以(abcd)为主键)
表2:i2,i1,e(以i2为主键)[替代方案:仅i1,e与(i1,e)为PK]
这里i1是数据集之间的链接。因此,Table1中的每个(abcd)都有一行,还有一些独特的i1。然后,对于与(abcd)相关联的每个e,您在Table2中创建一行,其中包含相应的i1和e。