mysql - 如果从同一个表中选择不存在如何插入?

标签 mysql database h2 insert-query

我在 H2 数据库中的表架构如下:

如果不存在则创建表测试( id bigint not null,name varchar(255),primary key (id) );

修改表测试如果不存在则添加约束Test_NAME UNIQUE(名称);

如果表中不存在 name 属性的值,我想通过从表中选择最新的 id 值并将其增加 1 来将其插入为“默认”。

示例: 如果 name = Default 的条目已存在,则不要插入。

ID |姓名

1 |默认

如果 name = Default 的条目不存在,则插入。

ID |姓名

1 | ABC

2 | XYZ

对于 id 列,找到最大 id 并将其加一。在本例中,插入 id=3 和 name=Default。

我的查询如下:

插入测试(id,名称) 从测试中选择 max(id) + 1,“默认” WHERE NOT EXISTS (SELECT * FROM Test where name='Default');

但是,它给了我一个错误: 列“ID”不允许为 NULL; SQL语句 因为它在内部 select 语句上应用了 where 条件。

我也尝试过: 合并到测试键(名称)值(从测试中选择 MAX(id) + 1,“默认”);

它给出了一个错误,因为合并尝试使用新值进行更新。 如果找到“默认”,它将使用新 id 更新该行,从而导致主键冲突。

有更好的方法吗?我怎样才能使查询工作?

最佳答案

你把这个问题搞得太复杂了。将 id 字段定义为 auto increment并在 name 字段上放置唯一索引。唯一索引可以防止插入重复的名称,而如果插入成功,自动增量会将 id 字段的值增加 1(默认情况下)。

关于mysql - 如果从同一个表中选择不存在如何插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46507827/

相关文章:

mysql - 更新 Liquibase 时的默认值

c++ - 验证数据库的结构? (C++/Qt 中的 SQLite)

database - 使用 Spring 启动和设置内存数据库

mysql - 棘手的 SQL 查询 - 需要获取时间范围

mysql - Ghost博客平台连接重置错误

数据库 |查询为员工分配的休假和休假,并应显示休假类别

java - 如何使我的触发器在类路径(h2 数据库)中可用

mysql - 插入 SQL DATEADD 昨天

php - 为什么我应该使用 bindValue/Param 而不是普通变量?

java - h2数据库无法处理中断如何处理