我们有一个基于 Hibernate (33.) 的 Web 应用程序,并发现与交换受唯一索引限制的数据值对相关的问题。在我们的机票 HBM 中,我们有
<many-to-one name="participants" class="net.umbrella.entity.ParticipantModel" fetch="select">
<column name="PARTICIPANTID" not-null="false" />
</many-to-one>
<many-to-one name="flights" class="net.umbrella.entity.FlightModel" fetch="select">
<column name="FLIGHTID" not-null="true" />
</many-to-one>
Run Code Online (Sandbox Code Playgroud)
从功能上讲,可以采用分配给参与者 P1 的票证 A 和分配给参与者 P2 的票证 B 的数据对并交换两个参与者。票证 A 最终将分配给参与者 P2,票证 B 将分配给参与者 P1。然而,FLIGHTID + PARTICIPANTID 有一个唯一的约束。
当 Hibernate 发出第一次更新以将票证 A 上的参与者 P1 更改为 P2 时,会引发 GenericJDBCException
Attempt to insert duplicate key row in object 'FLIGHTTICKET' with unique index 'IDX_FLIGHTTICKET_UQ'
Run Code Online (Sandbox Code Playgroud)
有人对此有共同的解决方案吗?
谢谢西蒙
在我的 PostgreSQL 9.4数据库中,我有一个包含唯一值fields列的表name。
我正在创建一个fields_new具有类似结构(此处不重要)和一列的新表name。我需要一种方法来约束name要插入到fields_new不存在于fields.name.
例如,如果fields.name包含值'color'和'length',我需要防止fields_new.name包含'color'或'length'值。因此,换句话说,我需要提供name两个表中的列之间没有任何重复值。约束应该是双向的。
sql postgresql database-design constraints unique-constraint
我回答说表只有一个主键,但可以有许多唯一的约束。但还有什么?
我的 Swift 应用程序从在线 API 以 JSON 形式下载 3 个数据库,然后将 JSON 对象转换为 CoreData 对象,因此该应用程序可以在互联网访问之外运行。
我有一个实体客户端,它与地址类型的实体有 toMany 关系。地址与实体客户端具有一对一的关系。
客户 <-->> 地址
客户端到地址关系具有级联删除规则,地址到客户端关系具有无效删除规则。
客户端对 id 属性有唯一性约束,并且上下文始终使用 NSMergePolicyType.overwriteMergePolicyType。
当实例化一个新的 Client NSManagedObject 时,保存上下文,并找到具有相同 ID 的 Client,新的 Client 会覆盖旧的 Client,但有一个很大的警告 - 由于某种未知的原因,旧的 Address 对象仍然存在,现在链接到新客户。这会在每次重新加载缓存/数据库时生成每个地址的新副本。
我有多个具有像这样的关系和唯一性的实体,它们会遇到相同的结果 - 多个对象实例的重复。
对于像 Address 这样的对象,没有一个属性可以封装容器中所有其他 Address 对象之间的唯一性。它必须是所有属性(地址 1、地址 2、城市、州、邮政编码等)的总和,并根据另一个地址的所有属性的总和检查唯一性。所以我不确定如何通过唯一性约束来实现这一点 - 据我所知,唯一性约束不能用 if 逻辑来扩展。
另一个解决方案是更改策略的合并行为,或创建自定义合并策略,以确保它在用新对象替换之前实际删除旧对象(级联到多对多关系对象)。
我对 CoreData 或 Objective-c 不太熟悉,无法跟踪迄今为止我在该主题上找到的任何内容。
有没有人对如何 A. 扩展唯一性约束功能、B. 定义合并策略行为或 C. 以其他方式防止上述地址对象重复有建议?
编辑:
我怀疑我对唯一性约束的假设是错误的 - 请参阅我关于它的单独问题
我正在使用 Django 1.11,当尝试导入时UniqueConstraint,我的情况很糟糕
AttributeError:模块“django.db.models”没有属性“UniqueConstraint”
错误。我不想降级到 unique_together,因为它似乎被贬值了。那么为什么我在最新版本的 Django 中遇到这个错误?
我通过以下方式导入它:
from django.db import models
class CalendarAccount(models.Model):
class Meta:
managed = False
db_table = 'my_table'
constraints = [
models.UniqueConstraint(...),
]
Run Code Online (Sandbox Code Playgroud) 如何在 SQLite 中设置可以正确处理空值的复合唯一约束?通过示例可能可以更好地表达这一点:
CREATE TABLE people (
id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
suffix TEXT,
UNIQUE (first_name, last_name, suffix)
);
Run Code Online (Sandbox Code Playgroud)
当多次输入带有后缀的人物时,该约束将按预期工作。
-- Last insert is denied
INSERT INTO people (first_name, last_name, suffix)
VALUES
('Joe', 'Dirt', 'Sr'),
('Joe', 'Dirt', 'Jr'),
('Joe', 'Dirt', 'Sr');
Run Code Online (Sandbox Code Playgroud)
然而,当多次插入没有后缀的人时,唯一约束就无法适应。
-- Both are permitted
INSERT INTO people (first_name, last_name)
VALUES
('Chris', 'Farley'),
('Chris', 'Farley');
Run Code Online (Sandbox Code Playgroud)
我知道 SQLite 将 null 值视为彼此独立,但是有没有办法解决这个问题?
每当我插入已存在于数据库中的实体时,我都会收到错误,因为其中一个字段(email)存在唯一约束.
所以我想检查它是否已经存在; 如果没有,我插入它.
我的代码看起来像这样:
$q = Doctrine_Query::create()
->from('User u')
->where('u.email = ?', $email);
$object = $q->fetchOne();
if( ! is_object($object)) {
$user = new User();
$user-email = $email;
$user->save();
}
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?
我认为这会有点深奥,但想把它扔出去,万一有人试过这样的事情,或者如果某人已经尝试过并发现它是不可能的.
我们有一个表需要对某组列进行唯一性约束,但它也有一个"软删除"指示符.已标记为"已删除"的记录不应包含在唯一性检查中.
这一切都很好,我可以使用独特的基于函数的索引轻松解决这个问题.然而,使问题复杂化的是,如果我们要在数据库中实现这个约束,它必须是延迟约束,因为Hibernate的工作方式.如果无法完成,我们将不得不省略约束,而我根本不愿意.
例如:
CREATE TABLE jkemp_test
( id NUMBER NOT NULL
, deleted_ind CHAR(1) DEFAULT 'N' NOT NULL);
CREATE UNIQUE INDEX jkemp_test_funique
ON jkemp_test
(CASE WHEN deleted_ind = 'N' THEN id END);
-- make this use the function-based index, maybe?
ALTER TABLE jkemp_test
ADD CONSTRAINT jkemp_test_unique
UNIQUE (id)
DEFERRABLE INITIALLY DEFERRED;
INSERT INTO jkemp_test VALUES (1,'N');
INSERT INTO jkemp_test VALUES (2,'N');
COMMIT;
UPDATE jkemp_test SET deleted_ind='Y' WHERE id=1;
COMMIT;
-- depending on whether the constraint is deferred or not, …Run Code Online (Sandbox Code Playgroud) 我有一个数据模型,其中许多实体从单个超类实体继承一些公共属性.我InheritanceType.JOINED在超类上使用,这导致Hibernate为超类中定义的属性创建单个表,子类表只包含由子类添加的列(因此要加载子类实例的属性,之间执行连接两个表).这一切都很好.
但是,我想要做的是指定一个唯一约束,该约束包括子类和超类表中的字段.例如,假设我的超类实体是这样的:
Thing: {id, name}
Run Code Online (Sandbox Code Playgroud)
...然后我有一些子类实体,如:
Company: {address} //inherits 'id' and 'name' from 'Thing'
Employee: {company} //inherits 'id' and 'name' from 'Thing'
Run Code Online (Sandbox Code Playgroud)
...并且我想配置Hibernate以自动强制给定Company不能具有Employee相同名称的两个.该company字段在Employee表中,但该name字段在Thing表中,所以有没有办法让Hibernate强制执行此约束,或者我是否需要在添加新的时以编程方式执行此操作Employee?
这是一个具体示例的通用问题.
我有一个包含三个字段的表(genreID(PK IDENTITY),流派和subGenre).该表对(genre,subGenre)组合有唯一约束.
我想知道如果表中不存在,我可以如何修改存储过程以插入,否则返回现有类型的genreID(如果它存在的话).
CREATE PROCEDURE spInsertGenre
@genreID int OUTPUT,
@genre varchar(100),
@subGenre varchar(100)= NULL
AS
BEGIN
INSERT INTO Genre
(
genre,
subGenre
)
Values (
@genre,
@subGenre
)
SELECT @genreID = SCOPE_IDENTITY()
END
GO
Run Code Online (Sandbox Code Playgroud) sql stored-procedures insert unique-constraint sql-server-2008-r2
sql ×5
hibernate ×2
constraints ×1
core-data ×1
django ×1
doctrine ×1
inheritance ×1
insert ×1
java ×1
oracle ×1
postgresql ×1
primary-key ×1
python ×1
sqlite ×1
swift ×1