SQL 错误:尝试插入到设置了触发器的表中时'Column [name] cannot be null'



我有一个触发器BEFORE INSERT包含:

set new.order_id = concat(new.account_id, '.', lpad(new.id, 4, '0'))

当我尝试用php插入一些数据时,像这样:

$insertorder = '
INSERT INTO orders
(
producten
)
VALUES
(
"'.$conn->real_escape_string($encodedproductenarray).'"
)';
我得到以下错误:There was an error running the query [Column 'order_id' cannot be null]

所以我试着像这样插入一些数据到列order_id:

$insertorder = '
INSERT INTO orders
(
order_id,
producten
)
VALUES
(
"1"
"'.$conn->real_escape_string($encodedproductenarray).'"
)';
$insertordercon = $conn->query($insertorder);

但是这给出了相同的错误。为什么?我需要换扳机上的东西吗?

触发器将account_idid(自动递增)合并在一起,中间有一个点,设置为order_id

当我使用phpmyadmin插入空数据时,插入工作和触发器也做它的工作(除了值是0.0000,因为一切都是空的),但由于某种原因,当使用下面的插入查询时,我得到了错误。

请检查new.account_id的可能值。如果它是空的,那么连接的结果将是空的,你会得到这个错误。

触发器将account_id和id(是自动递增的)合并在一起,中间有一个点,并将其设置为order_id

但是在BEFORE触发器中,自动递增尚未生成值。所以id是NULL

LPAD()函数如果任何参数为NULL则返回NULL。

mysql> select lpad(NULL, 4, '0');
+--------------------+
| lpad(null, 4, '0') |
+--------------------+
| NULL               |
+--------------------+

如果任何参数为NULL, CONCAT()函数返回NULL。

mysql> select concat('firstpart', '.', NULL);
+--------------------------------+
| concat('firstpart', '.', NULL) |
+--------------------------------+
| NULL                           |
+--------------------------------+

问题是你不能在BEFORE触发器中使用自动递增的数字,并且你不能在AFTER触发器中改变NEW.order_id

因此,您不能使用触发器根据自动增量值更改任何列。

您必须在INSERT之后的后续UPDATE中执行此操作。您可以在一个事务中执行这两个语句,这样其他会话就不会看到该行部分完成。

START TRANSACTION;
INSERT INTO orders ...;
UPDATE orders SET order_id = CONCAT(account_id, '.', LPAD(id, 4, '0'))
WHERE id = LAST_INSERT_ID();
COMMIT;

注:9999号订单之后会发生什么?

你不需要写这部分:

(
order_id,
producten
)

当您使用INSERT指令时,您必须按顺序写入每列应该包含的所有值。如果你想要一些"空的"列,把值设为空。插入时使用此结构

INSERT INTO table_name VALUES (value1,value2,value3)

相关内容

  • 没有找到相关文章

最新更新