0

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

2 回答 2

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,因此不清楚您在做什么。

于 2013-07-09T22:18:33.803 回答
0

您的主键 (abcd) 和值 (e) 之间存在一对多关系。因此,对于每个 (abcd),您都有许多 (e)。这不能使用一张表来完成,因为一张表中不能有重复的主键。

基本上你需要创建(至少)两个表而不是一个,即:

表1:a、b、c、d、i1(以(abcd)为主键) 表
2:i2、i1、e(以i2为主键)【备选:只有i1、e以(i1,e)为主键】

这里 i1 是您的数据集之间的链接。因此,您将在 Table1 中为每个 (abcd) 保留一行,以及一些唯一的 i1。然后对于与 (abcd) 关联的每个 e,您在 Table2 中创建一行,其中包含相应的 i1 和 e。

于 2013-07-09T22:39:22.120 回答