mysql使用主键插入和更新

时间:2013-07-09 21:28:34

标签: mysql

我有一个有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

2 个答案:

答案 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。