我问了一个问题here关于如何将sql函数(max)结果输入@variable以及如何使用它。我得到的答案非常直接和有用(对响应者而言:Tom Mac)。不,我在我的程序中使用相同的机制,我得到一个不可接受的结果,我将在这里解释: 请看看我的mysql控制台,一切都是自我解释的。甚至我的问题:):
> mysql> select max(command_idx) into @max_command_idx from command;
> Query OK, 1 row affected (0.00 sec)
现在首次使用该变量:
mysql> insert into command(controller_idx,subcontroller_idx,command_idx,controller_id, subcontroller_id,code,status,type,plan_name,timetable_id,offset,ctime,user_name,result) values
(0,0,@max_command_idx+1,'937','SUB0','SMS',0,'CONFIG','NA','NA',0,NOW(),'admin',0);
Query OK, 1 row affected (0.00 sec)
现在第二次将该变量用于另一个表:
> mysql> insert into > csmslist(controller_idx,subcontroller_idx,command_idx,csmslist_idx,phone) > values(0,0,@max_command_idx+1,0,'+60127929022');ERROR 1048 (23000): > Column 'command_idx' cannot be null
............................................... ........................
我的问题: 请您告诉我为什么会收到此错误?
谢谢 .................................................. .....................
关于我桌子的更多信息:
mysql> desc csmslist;
+-------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+-------------+------+-----+---------+-------+
| controller_idx | int(11) | NO | PRI | NULL | |
| subcontroller_idx | int(11) | NO | PRI | NULL | |
| command_idx | int(11) | NO | PRI | NULL | |
| csmslist_idx | int(11) | NO | PRI | NULL | |
| phone | varchar(24) | YES | | NULL | |
+-------------------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
mysql> desc command;
+-------------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+-------------+------+-----+-------------------+-----------------------------+
| controller_idx | int(11) | NO | PRI | NULL | |
| subcontroller_idx | int(11) | NO | PRI | NULL | |
| command_idx | int(11) | NO | PRI | NULL | auto_increment |
| controller_id | varchar(24) | YES | | NULL | |
| subcontroller_id | varchar(24) | YES | | NULL | |
| code | varchar(12) | YES | | NULL | |
| status | int(11) | YES | | NULL | |
| type | varchar(24) | YES | | NULL | |
| plan_name | varchar(24) | YES | | NULL | |
| timetable_id | varchar(24) | YES | | NULL | |
| offset | int(11) | YES | | NULL | |
| ctime | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| user_name | varchar(80) | YES | | NULL | |
| result | int(11) | YES | | NULL | |
+-------------------+-------------+------+-----+-------------------+-----------------------------+
14 rows in set (0.01 sec)
答案 0 :(得分:1)
命令表有一个auto_increment,当你将列设置为null时(这就是你正在做的事情,不管你认为你在做什么),它只是对它进行自动增量。
csmslist表没有自动增量,因此插入null失败。
请改为:
insert into csmslist(controller_idx,subcontroller_idx,command_idx,csmslist_idx,phone)
values(0,0,LAST_INSERT_ID(),0,'+60127929022');ERROR 1048 (23000):
Column 'command_idx' cannot be null
在command
的插入中,只需将列设为NULL,让数据库自动为您执行操作。
可能是命令表为空,因此它为最大值
返回NULLBTW而不是使用变量,您可以将该查询直接放在那里:
insert into csmslist(controller_idx,subcontroller_idx,command_idx,csmslist_idx,phone)
values(0,0,(select max(command_idx) from command),0,'+60127929022');ERROR 1048 (23000):
Column 'command_idx' cannot be null