主键id字段设置not null&seq自增之后, 插入数据时id字段赋值null报错?

如题,id字段设置了主键且自增,但是插入数据时的语句为 insert into table (id,name) values (null, 'zhagnsan')  会报错,但是这种语句在mysql是可以执行的,如何解决呢?正常情况下逻辑会有带id和不带id新增数据的情况

5回答

匪徒易真匪徒易真  数据库管理员 , 匪徒易真
主键怎么可能为空呢...显示全部

主键怎么可能为空呢...

收起
 21小时前
浏览3
匿名用户匿名用户
主键为空是什么骚操作,一般没有那么玩的吧显示全部

主键为空是什么骚操作,一般没有那么玩的吧

收起
 1天前
浏览18
孔再华孔再华  数据库运维工程师 , 中国民生银行
这种用法挺奇怪的,为啥自增列要插入空数据。换个不容易错乱的逻辑吧。显示全部

这种用法挺奇怪的,为啥自增列要插入空数据。换个不容易错乱的逻辑吧。

收起
 1天前
浏览19
在 mysql 8.0.23 上试验了一下你的语句:REATE TABLE entity4 ( id int(11) NOT NULL AUTO_INCREMENT, fitem_field int(11) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3;然后insert into entity4 (id,fitem_field) valu...显示全部

在 mysql 8.0.23 上试验了一下你的语句:
REATE TABLE entity4 ( id int(11) NOT NULL AUTO_INCREMENT, fitem_field int(11) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3;
然后
insert into entity4 (id,fitem_field) values (null,666);

确实可以成功,但是可以看到,实际上 mysql 是把 id 先按照 auto_increment=5 ,null+5=5 ,插入的记录的 id 是 5,而不是 null ;再同样语句插入一遍,id 就是 6 ;如果你期望的 id 是 null ,就不对了;

pgsql 上面可能是处理流程不一样;也许在语法检查时,就认为sql语句不正确,而不是先运算再检查语法;

试验过程如下:

mysql> CREATE TABLE entity4 ( id int(11) NOT NULL AUTO_INCREMENT, fitem_field int(11) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3;

Query OK, 0 rows affected, 3 warnings (0.09 sec)

mysql> show tables;

+---------------+

| Tables_in_twt |

+---------------+

| entity4 |

+---------------+

1 row in set (0.00 sec)

mysql>

mysql>

mysql>

mysql> insert into entity4 (id,fitem_field) values (null,666);

Query OK, 1 row affected (0.01 sec)

mysql> show tables;

+---------------+

| Tables_in_twt |

+---------------+

| entity4 |

+---------------+

1 row in set (0.00 sec)

mysql> select * from entity4;

+----+-------------+

| id | fitem_field |

+----+-------------+

| 5 | 666 |

+----+-------------+

1 row in set (0.00 sec)

mysql>

mysql>

mysql>

mysql>

mysql> insert into entity4 (id,fitem_field) values (null,666);

Query OK, 1 row affected (0.00 sec)

mysql> select * from entity4;

+----+-------------+

| id | fitem_field |

+----+-------------+

| 5 | 666 |

| 6 | 666 |

+----+-------------+

2 rows in set (0.00 sec)

mysql>

mysql>

mysql>

收起
 4天前
浏览77
  • 所以如果还是同样语法的情况下,pgsql没有好的解决方案吗?
  • https://stackoverflow.com/questions/45290236/cannot-insert-null-as-primary-key-value-in-postgresql-for-flask-sqlalchemy-after 也许和 pgloader 工具也有关系;
甘草片甘草片  软件开发工程师 , 安天科技
1   首先说这个是数据库基础理论问题2   我个人认为myslq 也不会成功 (如果id 是数字类型的主键)可以再聊聊你的正式需求和场景显示全部

1   首先说这个是数据库基础理论问题
2   我个人认为myslq 也不会成功 (如果id 是数字类型的主键)
可以再聊聊你的正式需求和场景

收起
 4天前
浏览71
  • 感谢评论, 1.以下代码是亲测可以成功的 CREATE TABLE `entity4` ( `id` int(11) NOT NULL AUTO_INCREMENT, `fitem_field` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3; insert into entity4 (id,fitem_field) values (null,666); 2.我们的场景是 1).正常的不带id新增数据 2).某些场景下 删除当前记录,并记录当前记录id,并重新组装新纪录的数据,赋予id字段值为刚才记录的值,然后带id新增数据 所以理论上是可以分为addDataWithId 和 addDataWithoutId两个方法的,但是如何公用一个方法呢?
  • 这个你可以看看pg的触发器去控制一下。应该好弄,mysql我估计也是在这个流程中做的控制。插入前做了一个判断。pg我感觉也可以写一下。这个就属于每个数据库的特性了。说实话,我真的想不出来什么时候会出现这个问题,insert 语句是为什么会把null 放在里面。

提问者

爱自由dev, aaa

问题状态

  • 发布时间:4天前
  • 关注会员:6 人
  • 问题浏览:762
  • 最近回答:21小时前