mySQL - 将值插入单个列会导致多行?

20 浏览
0 Comments

mySQL - 将值插入单个列会导致多行?

我正在向单列中插入多行数据。

下面是表格的定义:

CREATE TABLE Book (
   ID INT PRIMARY KEY AUTO_INCREMENT, 
   Title VARCHAR(100), 
   Author VARCHAR(40), 
   Pages INT, 
   Price FLOAT, 
   GENRE VARCHAR(30)
);

+----+---------------------------+----------------+-------+--------+-----------+
| ID | Book_Title                | Author         | Pages | Price  | GENRE     |
+----+---------------------------+----------------+-------+--------+-----------+
|  1 | The Lost Symbol           | Dan Brown      |   500 | 524.75 | Fiction   |
|  2 | Flamingo                  | NCERT          |   235 | 345.55 | Text Book |
|  3 | The Great Zoo of China    | Mathew Reilly  |   312 | 401.75 | Fantasy   |
|  4 | Walking from east to west | Ravi Zacharias |   240 | 220.45 | Biography |
|  5 | The Time Machine          | H.G Wells      |   245 | 120.45 | Novel     |
|  6 | Flamingo                  | NCERT          |   235 | 345.55 | Text Book |
+----+---------------------------+----------------+-------+--------+-----------+

ALTER TABLE Book ADD COLUMN Year INT;
INSERT INTO Book(Year) 
VALUES (1987), (2001), (1997), (1983), (1974), (2001);`

但是我得到了完全意外的结果:

+----+---------------------------+-------+--------+-----------+------+
| ID | Book_Title                | Pages | Price  | GENRE     | Year |
+----+---------------------------+-------+--------+-----------+------+
|  1 | The Lost Symbol           |   500 | 524.75 | Fiction   | NULL |
|  2 | Flamingo                  |   235 | 345.55 | Text Book | NULL |
|  3 | The Great Zoo of China    |   312 | 401.75 | Fantasy   | NULL |
|  4 | Walking from east to west |   240 | 220.45 | Biography | NULL |
|  5 | The Time Machine          |   245 | 120.45 | Novel     | NULL |
|  6 | Flamingo                  |   235 | 345.55 | Text Book | NULL |
|  7 | NULL                      |  NULL |   NULL | NULL      | 1987 |
|  8 | NULL                      |  NULL |   NULL | NULL      | 2001 |
|  9 | NULL                      |  NULL |   NULL | NULL      | 1997 |
| 10 | NULL                      |  NULL |   NULL | NULL      | 1983 |
| 11 | NULL                      |  NULL |   NULL | NULL      | 1974 |
| 12 | NULL                      |  NULL |   NULL | NULL      | 2001 |
+----+---------------------------+-------+--------+-----------+------+

PS: 我已经删除了列 Author

期望的结果是:

+----+---------------------------+-------+--------+-----------+------+
| ID | Book_Title                | Pages | Price  | GENRE     | Year |
+----+---------------------------+-------+--------+-----------+------+
|  1 | The Lost Symbol           |   500 | 524.75 | Fiction   | 1987 |
|  2 | Flamingo                  |   235 | 345.55 | Text Book | 2001 |
|  3 | The Great Zoo of China    |   312 | 401.75 | Fantasy   | 1997 |
|  4 | Walking from east to west |   240 | 220.45 | Biography | 1983 |
|  5 | The Time Machine          |   245 | 120.45 | Novel     | 1974 |
|  6 | Flamingo                  |   235 | 345.55 | Text Book | 2001 |
+----+---------------------------+-------+--------+-----------+------+

我参考了以下链接,但没有用:

服务器版本: 5.7.27-0ubuntu0.18.04.1

非常感谢您的帮助。

0
0 Comments

问题的原因是使用INSERT语句将值插入到单个列中会导致多行记录。解决方法是使用UPDATE语句代替INSERT语句。INSERT语句会创建新的记录,而你想要将更多的信息添加到现有的记录中。

具体的解决方法是使用UPDATE语句来更新每一行的值。你可以使用多个UPDATE语句,每个语句更新一行的值。例如:

UPDATE Book SET `Year` = 1987 WHERE ID = 1;
UPDATE Book SET `Year` = 2001 WHERE ID = 2;
UPDATE Book SET `Year` = 1997 WHERE ID = 3;
UPDATE Book SET `Year` = 1983 WHERE ID = 4;
UPDATE Book SET `Year` = 1974 WHERE ID = 5;
UPDATE Book SET `Year` = 2001 WHERE ID = 6;

或者你可以使用CASE语句来更新每一行的值。例如:

UPDATE Book
SET `Year` = CASE `ID`
                WHEN 1 THEN 1987
                WHEN 2 THEN 2001 
                WHEN 3 THEN 1997 
                WHEN 4 THEN 1983
                WHEN 5 THEN 1974 
                WHEN 6 THEN 2001 
           END
WHERE `ID` IN (1,2,3,4,5,6);

如果你不使用ID过滤器,建议在CASE语句中添加else部分。

有人问是否可以使用循环来实现这个功能,而另一个人回答可以使用一个更简短的版本。如果这个方法解决了你的问题,请不要忘记接受并点赞。

最后,如果有人问是否可以将其包装在一个更简单的方法中,请更新答案。一旦答案可行,我会将其标记为答案,但在我获得15个声望之前,我的点赞不会公开显示。

0