假设我有一个这样的表:
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)
问题:
我想在列上添加唯一约束code。active但仅当设置为true(仅应在活动记录中检查唯一性)时才应应用它。可以有许多带有active=false和相同的记录code,因此我不能对多列使用约束。
我尝试过的:
我在文档中没有找到任何参考文献证明这种约束是可能的,但我知道在其他数据库中使用基于函数的唯一索引是可能的。
当然,我可以编写一个触发器来检查每个添加/更新操作的不变量,但我希望有更有效的解决方案。
我正在使用 MySQL 5.7.15。
我正在将 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
我有一个postgres 8.3.4数据库.存在名称表,其对三元组UNIQ(名称,id,年龄)具有唯一约束.不知何故,有几行已添加到数据库中,导致违反此约束.
我的问题是这怎么可能?当添加违反约束的第一行时,数据库是否应该抛出错误?
name:text
id:integer not null(fk to id table)
age:integer
我有一个具有唯一字段的实体 A,该字段基本上定义了实体,这意味着它是相等的,那么实体也完全相同。
第二点是,如果违反该约束,则绝不是例外。这意味着完全可以预期用户会尝试输入重复项。
在重复的情况下,应用程序应该默默地选择已经存在的实体。我的问题现在是我应该做什么,特别是在保存包含 As 列表的实体时。
我不确定这是否容易实现,因为 DataIntegrityViolationException 不包含任何易于处理的信息,例如在级联持续的情况下受影响的实体!!!
我更喜欢这个,但是有相当大的开销,因为在每个插入之前可能有多个选择(存在检查)。
什么是更好的方法?
在史蒂夫·奥赫恩 (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)
这是我的问题:
创建两个唯一约束仅更改声明中的列顺序有什么意义?
我们创建了一个多列索引:“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)?
我有一个名为Dimension的实体.它有三个属性 - ID,宽度和高度.ID是主键.在表中,维度应该是唯一的,因此必须只有一个具有给定维度的记录(例如40x30).我需要设置什么约束?是对的uniqueConstraints={@UniqueConstraint(name="dimension", columns={"width", "height"})}吗?
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独一无二?
我想设置来自潜在客户和联系人的电子邮件是唯一的.
我试图改变/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的初学者,谢谢.
我想向可能已经有数据的列中添加一个序列,所以我试图从已有的序列开始。假设已经有数据,我想这样做:
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一样原始的东西。
我希望使用以下查询为表添加唯一约束 -
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)是重复的.
预计会有一些重复,但不幸的是我不能简单地删除或改变它们.
有没有办法根据需要添加约束,同时忽略表中的现有数据?
postgresql ×4
sql ×4
constraints ×3
database ×2
activerecord ×1
django ×1
django-orm ×1
doctrine-orm ×1
hibernate ×1
indexing ×1
jpa ×1
model ×1
mysql ×1
mysql-5.7 ×1
odoo ×1
odoo-8 ×1
openerp-8 ×1
oracle ×1
oracle11g ×1
python ×1
sequence ×1
symfony ×1