标签: unique-constraint

MySQL基于列值的唯一约束

假设我有一个这样的表:

CREATE TABLE dept (
  id     VARCHAR(255) NOT NULL PRIMARY KEY,
  code   VARCHAR(255) NOT NULL,
  active BIT          NOT NULL,
  ...
);
Run Code Online (Sandbox Code Playgroud)

问题:

我想在列上添加唯一约束codeactive但仅当设置为true(仅应在活动记录中检查唯一性)时才应应用它。可以有许多带有active=false和相同的记录code,因此我不能对多列使用约束。

我尝试过的:

我在文档中没有找到任何参考文献证明这种约束是可能的,但我知道在其他数据库中使用基于函数的唯一索引是可能的。

当然,我可以编写一个触发器来检查每个添加/更新操作的不变量,但我希望有更有效的解决方案。

我正在使用 MySQL 5.7.15。

mysql sql constraints unique-constraint mysql-5.7

4
推荐指数
1
解决办法
3121
查看次数

获取 django.db.utils.IntegrityError:重复的键值违反了唯一约束但值不存在

我正在将 PostgreSQL 与 Django 结合使用,并且尝试使用 Django ORM 从数据库中获取一些对象。

Medicine.objects.get(unique_item_id=26775)
Run Code Online (Sandbox Code Playgroud)

但是在获取时我遇到了错误 ->item_medicine.models.DoesNotExist: Medicine matching query does not exist.

然后我尝试使用 Django ORM 插入相同的内容。

Medicine.objects.create(unique_item_id=26775)
Run Code Online (Sandbox Code Playgroud)

但我再次收到错误psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "item_medicine_medicine_unique_item_id_key" DETAIL: Key (unique_item_id)=(26775) already exists.

在我的模型中,我添加了unique=True字段unique_item_id

我不知道为什么会发生这种情况。我尝试了类似帖子中给出的答案,但没有任何效果。

追溯:

Traceback (most recent call last):
  File "/home/rohit/virtualenvs/envmedicine/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "item_medicine_medicine_unique_item_id_key"
DETAIL:  Key (unique_item_id)=(26775) already exists.
The above exception was the direct cause of the …
Run Code Online (Sandbox Code Playgroud)

django postgresql django-models django-orm unique-constraint

4
推荐指数
1
解决办法
2311
查看次数

违反唯一约束的行

我有一个postgres 8.3.4数据库.存在名称表,其对三元组UNIQ(名称,id,年龄)具有唯一约束.不知何故,有几行已添加到数据库中,导致违反此约束.

我的问题是这怎么可能?当添加违反约束的第一行时,数据库是否应该抛出错误?

name:text
id:integer not null(fk to id table)
age:integer

database postgresql constraints unique-constraint

3
推荐指数
2
解决办法
1735
查看次数

JPA (Hibernate) + Spring:处理唯一约束违规

我有一个具有唯一字段的实体 A,该字段基本上定义了实体,这意味着它是相等的,那么实体也完全相同。

第二点是,如果违反该约束,则绝不是例外。这意味着完全可以预期用户会尝试输入重复项。

在重复的情况下,应用程序应该默默地选择已经存在的实体。我的问题现在是我应该做什么,特别是在保存包含 As 列表的实体时。

  • 只需捕获异常并从那里开始

我不确定这是否容易实现,因为 DataIntegrityViolationException 不包含任何易于处理的信息,例如在级联持续的情况下受影响的实体!!!

  • 保存前检查(持久化)并将提交的实体替换为现有实体(具有 id 集)

我更喜欢这个,但是有相当大的开销,因为在每个插入之前可能有多个选择(存在检查)。

什么是更好的方法?

hibernate jpa unique-constraint

3
推荐指数
1
解决办法
3985
查看次数

多列唯一约束中的列顺序有什么不同吗?有重复的索引是否合理?

在史蒂夫·奥赫恩 (Steve O'Hearn) 的“SQL 认证专家考试指南”中,我找到了这一段:

在创建复合索引以及调用同一索引的多个约束时,在极少数情况下,需要特殊语法。例如,如果我们决定在 INVOICES 表中的两个列上创建一个复合索引,我们可以使用以下语法:

CREATE TABLE invoices
(
    invoice_id    NUMBER(11),
    invoice_date  DATE,
    CONSTRAINT    un_invoices_invoice_id UNIQUE (invoice_id, invoice_date)
                  USING INDEX (CREATE INDEX ix_invoices
                                      ON invoices(invoice_id, invoice_date)),
    CONSTRAINT    un_invoices_invoice_date UNIQUE (invoice_date, invoice_id)
                  USING INDEX ix_invoices
);
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 创建两个唯一约束仅更改声明中的列顺序有什么意义?

  2. 我们创建了一个多列索引:“invoice_id”作为第一列,“invoice_date”作为第二列。但是让我们假设我们真的经常运行与“invoice_date”本身相关的查询,而没有“invoice_id”的参与。在“invoice_date”上创建第二个单列索引是个好主意吗?我知道:

由于 Oracle 支持多列索引,因此很容易意外创建“重复”索引,这些索引会增加 DML 的开销并且无助于加快 SQL 执行速度[来源]

我也知道:

由于跳过扫描引用复合索引中任何列的 WHERE 子句,可能会在处理过程中调用索引。[史蒂夫·奥赫恩]

但我也知道:

这不如简单的单列索引那么有益,它的好处因第一列中值的唯一性而异。[史蒂夫·奥赫恩]

因此,假设我们很少在此表上使用 DML 命令,并且假设我们与 SELECT 的 WHERE 子句中的两列相关,就像分别与“index_date”或“index_id”相关。在某些情况下,创建两个索引是否合理?一,多列索引,在(index_id,index_date)上,第二,单列索引,在(index_date)?

sql oracle indexing unique-constraint oracle11g

3
推荐指数
2
解决办法
2680
查看次数

Doctrine中两列的唯一值

我有一个名为Dimension的实体.它有三个属性 - ID,宽度和高度.ID是主键.在表中,维度应该是唯一的,因此必须只有一个具有给定维度的记录(例如40x30).我需要设置什么约束?是对的uniqueConstraints={@UniqueConstraint(name="dimension", columns={"width", "height"})}吗?

sql constraints unique-constraint symfony doctrine-orm

3
推荐指数
1
解决办法
6116
查看次数

如何在除了id之外的rails活动记录中创建一个唯一列

class CreateUsers < ActiveRecord::Migration
   def up
     create_table :users do |t|
        t.string "email", :unique=>true
Run Code Online (Sandbox Code Playgroud)

我试图添加这个独特的选项,使这个电子邮件ID在rails模型中独一无二,但它没有工作,所以我如何才能使这个电子邮件ID独一无二?

database activerecord model ruby-on-rails unique-constraint

3
推荐指数
2
解决办法
1万
查看次数

Odoo v8中的唯一电子邮件字段

我想设置来自潜在客户和联系人的电子邮件是唯一的.

我试图改变/usr/lib/python2.7/dist-packages/openerp/models.py文件,第342行:

_sql_constraints = []
Run Code Online (Sandbox Code Playgroud)

在:

_sql_constraints = [
        ('user_email', 'unique(user_email)', 'Please enter Unique Email'),
]
Run Code Online (Sandbox Code Playgroud)

但是没有用.

什么是正确的方法,请给我一个完整的例子,因为我是Odoo的初学者,谢谢.

python unique-constraint openerp-8 odoo odoo-8

3
推荐指数
1
解决办法
1796
查看次数

PostgreSQL:从MAX(the_column)+1开始一个序列

我想向可能已经有数据的列中添加一个序列,所以我试图从已有的序列开始。假设已经有数据,我想这样做:

CREATE SEQUENCE my_sequence MINVALUE 1000000 START
    (SELECT MAX(id_column) FROM my_table) OWNED BY my_table.id_column;
Run Code Online (Sandbox Code Playgroud)

但是它一直渴望(声明语法错误。就像起始值必须是冷硬数字-没什么象征意义。

当然,更好的解决方案是,如果序列具有足够的智能性来避免重复的值,因为id_column它具有唯一的约束,这就是我这样做的原因。但是据我所知,这是不可能的。

我还尝试跳过START,然后执行以下操作:

ALTER SEQUENCE my_sequence RESTART WITH (SELECT max(id_column)+1 FROM my_table);
Run Code Online (Sandbox Code Playgroud)

但是,同样,它似乎不像符号起始值。

我正在运行PostgreSQL 9.4,但是我们的一些客户使用的是像8.3一样原始的东西。

postgresql sequence unique-constraint

3
推荐指数
2
解决办法
2051
查看次数

添加唯一约束但忽略现有表数据

我希望使用以下查询为表添加唯一约束 -

ALTER TABLE events ADD CONSTRAINT events_timestamp_request_session_key UNIQUE (event_timestamp, request_id, session_id);
Run Code Online (Sandbox Code Playgroud)

查询有效,但是在一个数据库上现有数据不符合约束,因此查询失败 -

错误:无法创建唯一索引"events_timestamp_request_session_key"
DETAIL:密钥(event_timestamp,request_id,session_id)=(2017-07-05 14:53:25.475246 + 00,a55df6-8533e322cd-aa9d57-87e2,132443)是重复的.

预计会有一些重复,但不幸的是我不能简单地删除或改变它们.

有没有办法根据需要添加约束,同时忽略表中的现有数据?

sql postgresql unique-constraint

3
推荐指数
1
解决办法
3092
查看次数