互联网服务PostgreSQL

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

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

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

收起
参与17

查看其它 4 个回答沈天真的回答

沈天真沈天真售前支持IPS

在 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>

硬件生产 · 2022-01-14
浏览1948
  • 所以如果还是同样语法的情况下,pgsql没有好的解决方案吗?
    2022-01-14
  • https://stackoverflow.com/questions/45290236/cannot-insert-null-as-primary-key-value-in-postgresql-for-flask-sqlalchemy-after 也许和 pgloader 工具也有关系;
    2022-01-14

回答者

沈天真
售前支持IPS
擅长领域: 服务器云计算存储

沈天真 最近回答过的问题

回答状态

  • 发布时间:2022-01-14
  • 关注会员:6 人
  • 回答浏览:1948
  • X社区推广