postgresql 如何执行INSERT INTO SELECT,并将DEFAULT作为主键?

wlsrxk51  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

我正在尝试将非重复值从一个表列复制到另一个表列。但是,在尝试为新记录创建主键时,我遇到了一些问题。
数据库:AWS RDS上的PostgreSQL

INSERT INTO target (name)
SELECT DISTINCT field_name FROM source
WHERE source.field_name IS NOT NULL
RETURNING *;

执行此操作会导致错误:

sqlalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) null value in column "id" of relation "target" violates not-null constraint
DETAIL:  Failing row contains (null, mydummyfieldname).

我所有的研究都让我得出了如下结论:

INSERT INTO target (id, name)
VALUES (DEFAULT, 'name1'), (DEFAULT, 'name2')

但是,我不清楚如何将DEFAULTSELECT子句一起使用。

**问题:**如何在原始SQL中使用SELECT子句和DEFAULT

不允许我修改任何一个表的主键以使用serial或类似的东西。
表定义(使用SQLAlchemy ORM)

class Source(Base):

    id = Column(
        UUID(as_uuid=True),
        primary_key=True,
        default=uuid.uuid4,
    )
    field_name = Column(
        String,
        nullable=False,
    )

class Target(Base):

    id = Column(
        UUID(as_uuid=True),
        primary_key=True,
        default=uuid.uuid4,
    )
    name = Column(
        String,
        nullable=False,
        unique=True,
    )
rsaldnfx

rsaldnfx1#

在问题顶部显示的SQL不会产生下面列出的错误。- -理查德·赫斯顿
@RichardHuxton...真的吗?我正在查看这个错误。
不,不是的

richardh=> CREATE TABLE target (id uuid DEFAULT gen_random_uuid() PRIMARY KEY, name text NOT NULL);
CREATE TABLE
richardh=> CREATE TABLE source (field_name text NOT NULL);
CREATE TABLE
richardh=> INSERT INTO source VALUES ('aaa');
INSERT 0 1
richardh=> INSERT INTO target (name) SELECT DISTINCT field_name FROM source WHERE source.field_name IS NOT NULL RETURNING *;
                  id                  | name 
--------------------------------------+------
 27e8410d-fdea-4224-8e4d-5471e36f10a1 | aaa
(1 row)

INSERT 0 1

您的ORM没有生成该查询,或者您的表定义没有默认的id。始终首先检查实际的SQL和模式。

相关问题