我正在尝试将非重复值从一个表列复制到另一个表列。但是,在尝试为新记录创建主键时,我遇到了一些问题。
数据库: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')
但是,我不清楚如何将DEFAULT
与SELECT
子句一起使用。
**问题:**如何在原始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,
)
1条答案
按热度按时间rsaldnfx1#
在问题顶部显示的SQL不会产生下面列出的错误。- -理查德·赫斯顿
@RichardHuxton...真的吗?我正在查看这个错误。
不,不是的
您的ORM没有生成该查询,或者您的表定义没有默认的id。始终首先检查实际的SQL和模式。