【问题标题】:Create table data if table data is not empty如果表数据不为空,则创建表数据
【发布时间】:2021-11-05 14:31:40
【问题描述】:

我使用这个 SQL 脚本通过 Liquibase 生成测试数据。每次启动 Spring Boot 应用程序时都应该运行此脚本。

INSERT into tasks SELECT generate_series(1,355) AS id,
    ('Business name ' || generate_series(1,355)) AS business_name,
    (select NOW() + (random() * (NOW() + '90 days' - NOW())) + '30 days') AS created_at,
    left (md5(random()::text), 10) AS meta_title,
    left (md5(random()::text), 10) AS status,
    left (md5(random()::text), 10) AS title,
    left (md5(random()::text), 10) AS task_type,
    (select NOW() + (random() * (NOW() + '90 days' - NOW())) + '30 days') AS updated_at;

问题是当我多次运行脚本时出现此问题:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "tasks_pkey"
  Detail: Key (id)=(1) already exists.

我使用这个 Hibernate 配置来创建一个表:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, updatable = false, nullable = false)
private Long id;

是否可以在脚本运行时始终生成新的附加行?

【问题讨论】:

    标签: sql postgresql hibernate


    【解决方案1】:

    为什么不直接将 id 创建为自增主键,然后您可以将任何您想要的记录插入到表中,而不用担心 id 字段?

    【讨论】:

    • 你能提供更多细节吗?
    • 您的意思是有关如何执行此操作的更多详细信息?在你的 postgresql 文档中搜索“serial”这个词
    • 如果id 已经设置为标准主键(可能假定唯一约束称为tasks_pkey),您可以只从代码中删除generate_series(1,355) AS id, .无需您执行任何操作即可分配 ID。
    • ok 看起来正确的方法是使用 @GeneratedValue(strategy = GenerationType.SEQUENCE) 和 Postgres
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2020-06-27
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多