Stack Overflow上有很多这些帖子,但是从20左右开始,我看到他们要么是在与MySQL连接时遇到的编码错误(我不想做)或只是想要null值但是他们有表定义不正确。
我在MySQL 5.6.19中看到一个错误,其中我有一个不允许具有空值的列。这很好,因为它不应该有空值。这是下面的表格。
mysql> describe z;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| a | int(11) | NO | PRI | NULL | auto_increment |
| data | char(30) | NO | | NULL | |
| t | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
我的问题是我正在插入有效数据....
mysql> insert into z (data, t) values('helloworld', sysdate());
ERROR 1048 (23000): Column 'data' cannot be null
还有一条信息可能会引起一些关注......或者可能不是。
我有一个触发器和过程,在执行插入此列时执行。但是我没有看到它应该是一个问题,因为在insert语句完成后触发器被激活。
这是触发器:
mysql> show triggers\G
*************************** 1. row ***************************
Trigger: insertuser
Event: INSERT
Table: z
Statement: begin
call triggerproc(sysdate(),user(),(select data from z where a = last_insert_id()));
end
Timing: AFTER
Created: NULL
sql_mode: NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
程序:
mysql> show create procedure triggerproc\G
*************************** 1. row ***************************
Procedure: triggerproc
sql_mode: NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `triggerproc`(in a datetime, in b char(30), in c char(30))
begin
insert into record (t,u,data) values(a,b,c);
end
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
为了好的衡量,我还将包括记录表的定义。
mysql> desc record;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| t | datetime | NO | | NULL | |
| u | char(30) | NO | | NULL | |
| data | char(30) | NO | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
我已经查看了MySQL参考手册中的任何可能有用的内容,但是除了标准错误之外,似乎没有任何其他详细信息,并检查您的列未定义为非null。或者我错过了......
无论如何,如果有人能帮助我找出错误的原因或者我如何找到原因,我将非常感激。
提前致谢。
编辑:TheConstructor我的问题得到了很好的回答,他告诉我要从刚刚通过触发器插入的列中获取新信息,可以使用NEW.column运算符。此外,他随后提供了有助于理解位于Trigger Syntax的
的问题的文档我只想知道为什么我的触发器不会与insert语句一起使用,即使它应该在前一个语句之后激活,这使我相信它应该(理论上)工作。 < / p>
答案 0 :(得分:6)
阅读LAST_INSERT_ID()
上的文档我建议只在最后一次触发器运行后更新该值。我还创建了一个触发器,它将LAST_INSERT_ID()
的结果插入到另一个表中,如果之前没有INSERT
,它将始终插入由0
语句插入的行的id。 {1}}。
在插入或更新触发器中,您始终可以使用INSERT
引用语句后的状态,其中NEW.column
是表的列名。 See the documentation for examples