使用带有WHERE IN子句的SELECT语句执行INSERT尝试插入仅由SELECT语句返回的值

时间:2018-05-03 15:33:22

标签: mysql

我尝试使用以下MySQL语句将值插入空表:

INSERT INTO buildings (name, description)
SELECT structures.name, structures.description
FROM structures
WHERE structures.structure_id IN (1, 2, 3, 4)
AND structures.deleted_at IS NULL;`

当我单独执行SELECT语句时,将返回预期的行。但是,当与INSERT结合使用时,我会收到"数据截断"错误,因为该语句似乎试图插入已被软删除的行,因此其ID已更改为1__DEL__2016-06-21 18:19:53。作为发生这种情况的证据,从WHERE IN子句中删除1可以防止错误。

结构表如下所示:

+-----------------------------+----------+----------------------------------+----------------------+
| structure_id                | name     | description                      | deleted_at           |
+-----------------------------+----------+----------------------------------+----------------------+
| 1                           | House    | Place for people.                | null                 |
+-----------------------------+----------+----------------------------------+----------------------+
| 1__DEL__2016-06-21 18:19:53 | Home     | Another name for house.          | 2016-06-21 18:19:53  |
+-----------------------------+----------+----------------------------------+----------------------+
| 2                           | Barn     | Place for animals.               | null                 |
+-----------------------------+----------+----------------------------------+----------------------+
| 3                           | Outhouse | Place to go when you need to go. | null                 |
+-----------------------------+----------+----------------------------------+----------------------+

所以,我很好奇(a)为什么会发生这种情况,以及(b)如何在不从源表中删除软删除条目的情况下插入我需要的数据。

对我来说似乎特别奇怪的是,WHERE IN子句似乎与11__DEL__2016-06-21 18:19:53都匹配,好像它没有选择完全匹配。

感谢。

1 个答案:

答案 0 :(得分:0)

由于Where子句中的structure_id列是varchar,因此应该用引号括住IN子句中的值。