我想在postgresql中设置一个表,这样两列一起必须是唯一的.任何一个值都可以有多个值,只要没有两个值共享两者.
例如:
CREATE TABLE someTable (
id int PRIMARY KEY AUTOINCREMENT,
col1 int NOT NULL,
col2 int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
所以,col1和col2可以重复,但不能在同一时间.所以,这是允许的(不包括id)
1 1
1 2
2 1
2 2
Run Code Online (Sandbox Code Playgroud)
但不是这个:
1 1
1 2
1 1 -- would reject this insert for violating constraints
Run Code Online (Sandbox Code Playgroud) 我在PostgreSQL中有一个表,其中的模式如下所示:
CREATE TABLE "foo_table" (
"id" serial NOT NULL PRIMARY KEY,
"permalink" varchar(200) NOT NULL,
"text" varchar(512) NOT NULL,
"timestamp" timestamp with time zone NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
现在,我希望通过ALTER-ing表使表中的固定链接唯一.任何人都可以帮我吗?
TIA
我有下表
CREATE TABLE "prm_project_service_product_and_services" (
"id" BIGSERIAL NOT NULL,
"name" VARCHAR(60) NOT NULL,
"note" VARCHAR(256) NOT NULL,
"version" BIGINT DEFAULT NULL,
"created_date" TIMESTAMP DEFAULT NULL,
"created_by_id" BIGINT DEFAULT NULL,
"last_modified_date" TIMESTAMP DEFAULT NULL,
"last_modified_by_id" BIGINT DEFAULT NULL,
"deleted" BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY ("id"),
CONSTRAINT project_service_product_and_services_unique UNIQUE ("name")
);
Run Code Online (Sandbox Code Playgroud)
我只想在是时才变得name独特,这可能吗?deletedfalse
我有这种布局的模型:
class SafeDeleteModel(models.Model):
.....
deleted = models.DateTimeField(editable=False, null=True)
......
class MyModel(SafeDeleteModel):
safedelete_policy = SOFT_DELETE
field1 = models.CharField(max_length=200)
field2 = models.CharField(max_length=200)
field3 = models.ForeignKey(MyModel3)
field4 = models.ForeignKey(MyModel4)
field5 = models.ForeignKey(MyModel5)
class Meta:
unique_together = [['field2', 'field3', 'field4', 'deleted'],]
Run Code Online (Sandbox Code Playgroud)
这里的场景是我从不希望用户删除数据。相反,删除只会隐藏记录。但是,我仍然希望所有非软删除的记录都遵守唯一键约束。基本上,我希望有尽可能多的重复删除记录,但只能存在一个唯一的未删除记录。所以我想包括“已删除”字段(由 django-safedelete 库提供),但问题变成了 Django 的唯一检查失败,“psycopg2.IntegrityError:重复键值违反唯一约束”对于 ['field2', 'field3' , 'field4', 'deleted'] 因为 NULL 不“等于” NULL 并且它在 PostgreSQL 中产生 false。
有没有办法用我的 Django 模型布局来强制执行 unique_together 约束?或者是否有更好的想法物理删除记录,然后将其移动到存档数据库,如果用户想要恢复记录,那么软件将在存档中查找记录并重新创建它?