Mysql 如何使用同一个表中有100多列的多个列中的值插入行?可能使用循环?

Mysql 如何使用同一个表中有100多列的多个列中的值插入行?可能使用循环?,mysql,sql,sql-server,Mysql,Sql,Sql Server,在这里输入代码 假设我有下表: ID Name ID2 ID3 ID4 ID100 1 Smith 2 3 4 100 20 Joe 10 20 30 200 30 Jane 40 50 60 300 如何编写一条语句,一次遍历ID2-ID100列,从列和名称列中获取值,并向表中添加新行 看起来是这样的: 我这样做了,但我确实想写100行选择。 如果您使用外键概念,或者使用excel编写那些select,则这是可能的。您的数据库通过创建重

在这里输入代码

假设我有下表:

ID Name ID2 ID3 ID4 ID100 1 Smith 2 3 4 100 20 Joe 10 20 30 200 30 Jane 40 50 60 300 如何编写一条语句,一次遍历ID2-ID100列,从列和名称列中获取值,并向表中添加新行

看起来是这样的:

我这样做了,但我确实想写100行选择。


如果您使用外键概念,或者使用excel编写那些select,则这是可能的。您的数据库通过创建重复的组违反了第一个标准形式。RDBMS的设计不是为了干净地处理这种设计。这正是您不想创建重复组的原因。除重新设计之外的任何解决方案都将是丑陋而缓慢的

如果重新设计不是一种选择,那么答案是只做一次痛苦的部分,然后不需要再做一次

创建以下视图:

CREATE VIEW MyUglyTable_Unpivot (ID, Name, Field_ID, Field_Value) AS
SELECT ID, Name, 'ID2',   ID2   FROM MyTable WHERE ID2   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID3',   ID3   FROM MyTable WHERE ID3   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID4',   ID4   FROM MyTable WHERE ID4   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID5',   ID5   FROM MyTable WHERE ID5   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID6',   ID6   FROM MyTable WHERE ID6   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID7',   ID7   FROM MyTable WHERE ID7   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID8',   ID8   FROM MyTable WHERE ID8   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID9',   ID9   FROM MyTable WHERE ID9   IS NOT NULL UNION ALL
...
SELECT ID, Name, 'ID99',  ID99  FROM MyTable WHERE ID99  IS NOT NULL UNION ALL
SELECT ID, Name, 'ID100', ID100 FROM MyTable WHERE ID100 IS NOT NULL
显然,您可以为视图和字段选择更合理的名称。如果基础表对这些字段具有NOTNULL约束,则可以省略WHERE XXXX NOTNULL,但根据我的经验,它们没有。如果您知道确实需要显式空值,也可以省略它,但这通常被认为是糟糕的设计。NULL太不明确了

视图将非常缓慢,但它将让您更容易地执行此类操作。如果您能够重新设计您的系统,使其不使用重复组,我强烈建议您这样做

现在您可以执行以下操作:

INSERT INTO MyTable (ID, Name)
SELECT Field_Value, Name FROM MyUglyTable_Unpivot
WHERE Name = 'Smith'

尽管如此,我还是认为您需要在MyTable中的某个位置设置字段ID,以便理解所有内容。

您为什么要设计这种混乱?创建另一个表,该表通过外键引用此表并包含这些值。它看起来非常像这100列应该是子表中的行,父表带有FK。也许这个观察在这一点上没有帮助,但它可能对您的下一个DB设计有用。使用Excel中的公式编写行。然后将它们复制到您的SQL接口中。这是SQL server还是mysql?
CREATE VIEW MyUglyTable_Unpivot (ID, Name, Field_ID, Field_Value) AS
SELECT ID, Name, 'ID2',   ID2   FROM MyTable WHERE ID2   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID3',   ID3   FROM MyTable WHERE ID3   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID4',   ID4   FROM MyTable WHERE ID4   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID5',   ID5   FROM MyTable WHERE ID5   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID6',   ID6   FROM MyTable WHERE ID6   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID7',   ID7   FROM MyTable WHERE ID7   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID8',   ID8   FROM MyTable WHERE ID8   IS NOT NULL UNION ALL
SELECT ID, Name, 'ID9',   ID9   FROM MyTable WHERE ID9   IS NOT NULL UNION ALL
...
SELECT ID, Name, 'ID99',  ID99  FROM MyTable WHERE ID99  IS NOT NULL UNION ALL
SELECT ID, Name, 'ID100', ID100 FROM MyTable WHERE ID100 IS NOT NULL
INSERT INTO MyTable (ID, Name)
SELECT Field_Value, Name FROM MyUglyTable_Unpivot
WHERE Name = 'Smith'