我尝试使用以下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子句似乎与1
和1__DEL__2016-06-21 18:19:53
都匹配,好像它没有选择完全匹配。
感谢。
答案 0 :(得分:0)
由于Where子句中的structure_id列是varchar,因此应该用引号括住IN子句中的值。