gpt4 book ai didi

mysql 在重复键上插入更新 - 当 col 具有默认 null 时的奇怪行为

转载 作者:行者123 更新时间:2023-11-29 11:52:43 26 4
gpt4 key购买 nike

我有一个表 my_table:

col_a varchar(20) not null, no default
col_b varchar(10) not null, no default
col c varchar(5) null, default null

col_acol_b 上有唯一索引

存在一个现有行,其中:col_a = 'ABCDEF-123'col_b = '1543'col_c = 'Apples'

如果我执行以下命令,错误代码为 0,但没有更新任何行。

insert into my_table (col_a,col_b,col_c) values ('ABCDEF-123','1543','Oranges') ON DUPLICATE KEY UPDATE col_c=concat(col_c,',','Oranges');

如果我更改表并使 col_c 不为空且没有默认值,则该命令可以完美运行并通过将“,Oranges”附加到 col_c 来更新现有行。

--> 这是默认为 null 的非索引列的预期行为吗?为什么?对我来说这看起来像是一个错误。 MySQL 版本为 5.0.95

最佳答案

CONCAT如果任何参数为 NULL,则返回 NULL

您的 col_c 太短,因此它永远不会更新,因为该值与以前没有不同。

CREATE TABLE my_table (
col_a VARCHAR(20) NOT NULL,
col_b VARCHAR(10) NOT NULL,
col_c VARCHAR(5) NULL DEFAULT NULL,
UNIQUE INDEX (col_a, col_b)
);

INSERT INTO my_table (col_a,col_b,col_c) VALUES ('ABCDEF-123','1543','Apples');
Query OK, 1 row affected, 1 warning (0.06 sec)

我们收到“1 个警告”:

SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 'col_c' at row 1 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)

col_c 仅允许 5 个字符,因此插入时值将被截断。我们可以在检查表格时验证这一点:

SELECT * FROM my_table;
+------------+-------+-------+
| col_a | col_b | col_c |
+------------+-------+-------+
| ABCDEF-123 | 1543 | Apple |
+------------+-------+-------+
1 row in set (0.00 sec)

好的,现在尝试插入另一行:

insert into my_table (col_a,col_b,col_c) values ('ABCDEF-123','1543','Oranges') ON DUPLICATE KEY UPDATE col_c=concat(col_c,',','Oranges');
Query OK, 0 rows affected, 2 warnings (0.00 sec)

上面写着“2 个警告”。那么让我们检查一下:

SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 'col_c' at row 1 |
| Warning | 1265 | Data truncated for column 'col_c' at row 1 |
+---------+------+--------------------------------------------+
2 rows in set (0.00 sec)

CONCAT 值将为“Apple,Oranges”,它将被截断为“Apple”,与之前相同。

关于mysql 在重复键上插入更新 - 当 col 具有默认 null 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33751272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com