是否可以使用 Fluent API 在实体框架核心中创建不区分大小写的唯一索引?
例如,可以使用以下 SQL 在 Oracle 中定义不区分大小写的唯一索引:
create unique index test on "Person"(lower("Name"));
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,EF Core 中的唯一选项是区分大小写的唯一约束,例如:
builder.HasIndex(e => e.Name)
.IsUnique();
Run Code Online (Sandbox Code Playgroud)
我已经尝试过以下方法,但它不起作用:
builder.HasIndex(e => e.Name.ToLower())
.IsUnique();
Run Code Online (Sandbox Code Playgroud) oracle entity-framework unique-constraint entity-framework-core ef-fluent-api
所以我有一些看起来像这样的模型
class Person(BaseModel):
name = models.CharField(max_length=50)
# other fields declared here...
friends = models.ManyToManyField(
to="self",
through="Friendship",
related_name="friends_to",
symmetrical=True
)
class Friendship(BaseModel):
friend_from = models.ForeignKey(
Person, on_delete=models.CASCADE, related_name="friendships_from")
friend_to = models.ForeignKey(
Person, on_delete=models.CASCADE, related_name="friendships_to")
state = models.CharField(
max_length=20, choices=FriendshipState.choices, default=FriendshipState.pending)
Run Code Online (Sandbox Code Playgroud)
基本上,我正在尝试模拟一种类似 Facebook 的好友场景,其中有不同的人,并且可以邀请任何其他人成为好友。这种关系是通过最后一个模型来表达的Friendship。
到目前为止,一切都很好。但我想避免三种情况:
friend_from和friend_to领域有同一个人Friendship一组两个朋友只允许使用一个。我最接近的是将其添加到Friendship模型下:
class Meta:
constraints = [
constraints.UniqueConstraint(
fields=['friend_from', 'friend_to'], name="unique_friendship_reverse"
),
models.CheckConstraint(
name="prevent_self_follow",
check=~models.Q(friend_from=models.F("friend_to")),
)
]
Run Code Online (Sandbox Code Playgroud)
这完全解决了情况1,避免某人与自己交朋友,使用CheckConstraint. 并部分解决了第二种情况,因为它避免了Friendships这样的两种情况:
p1 = Person.objects.create(name="Foo") …Run Code Online (Sandbox Code Playgroud) 在表中,我想确保在五列密钥上只存在唯一的值:
Timestamp Account RatingDate TripHistoryKey EventAction
========= ======= ========== ============== ===========
2010511 1234 2010511 1 INSERT
2010511 1234 2010511 4 INSERT
2010511 1234 2010511 7 INSERT
2010511 1234 2010511 1 INSERT <---duplicate
Run Code Online (Sandbox Code Playgroud)
但我只希望唯一约束,以行之间适用时EventAction是INSERT:
Timestamp Account RatingDate TripHistoryKey EventAction
========= ======= ========== ============== ===========
2010511 1234 2010511 1 INSERT
2010511 1234 2010511 1 UPDATE
2010511 1234 2010511 1 UPDATE <---not duplicate
2010511 1234 2010511 1 UPDATE <---not duplicate
2010511 1234 2010511 1 DELETE <---not duplicate
2010511 …Run Code Online (Sandbox Code Playgroud) sql-server sql-server-2005 sql-server-2000 unique-constraint multiple-columns
在Oracle 10g中,如何在不知道约束名称的情况下删除列上的唯一约束(例如,系统生成的名称,在数据库实例中不一定相同)?删除并重新创建表不是一种选择.可能吗?
如何添加sql表的唯一约束作为sql server 2005中另一个sql表的外键引用
如果我在XSD中有以下元素规范,我可以将<xs:unique>约束添加为子项,<xs:element name="Parent">但我不能让它作为子项工作<xs:element name="Child">:
<xs:element name="Parent">
<xs:complexType>
<xs:element name="Child" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="Key" type="xs:string" use="required" />
</xs:complexType>
<!-- Option A: insert unique constraint here with selector . -->
</xs:element>
</xs:complexType>
<!-- Option B: insert unique constraint here with selector ./Child -->
</xs:element>
Run Code Online (Sandbox Code Playgroud)
这是作为孩子的唯一约束<xs:element name="Parent">:
<xs:unique name="ChildKey">
<xs:selector xpath="./Child"/>
<xs:field xpath="@Key" />
</xs:unique>
Run Code Online (Sandbox Code Playgroud)
但是这种独特的约束并不适合作为孩子<xs:element name="Child">:
<xs:unique name="ChildKey">
<xs:selector xpath="."/>
<xs:field xpath="@Key" />
</xs:unique>
Run Code Online (Sandbox Code Playgroud)
在第二种情况下是否需要更改选择器XPath?
我目前已将此约束添加到表中 MY_TABLE
ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_UNQ_01 UNIQUE (COLUMN1, COLUMN2, COLUMN3) USING INDEX TABLESPACE "MY_TABLE_INDEX";
问题是我添加了一个新列:
ALTER TABLE MY_TABLE ADD (DRAFT NUMBER(1,0));
现在,约束应仅在列DRAFT= 0时应用
有什么方法可以做到这一点?
我正在尝试将数据添加到我的SQL数据库中,当我输入以下代码时:
INSERT INTO EMPLOYEES
VALUES('100','STEVEN','King','sking@yahoo.com','PSEUDO',
to_date('17-JAN-87','dd-mm-yy'),'AD_VP',24000,0.45,90);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ERROR at line 1:
ORA-00001: unique constraint (ODEHat01.SYS_C00292486) Violated
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么,因为当我描述我的表(desc employees;)时,它表明我有10个字段,我试图将数据输入到10个字段中.非常感谢任何帮助,所以我可以将数据输入我的员工表.谢谢.
我有一张桌子:
CREATE TABLE dbo."TransportInteraction"
(
"Id" bigint NOT NULL DEFAULT nextval('dbo."TransportInteraction_Id_seq"'::regclass),
"Message" character varying(256),
"TransportActionId" integer NOT NULL,
"TimeCreated" timestamp without time zone NOT NULL,
"TimeInserted" timestamp without time zone NOT NULL,
"TaskId" bigint
)
Run Code Online (Sandbox Code Playgroud)
通常,此表是对任务的映射操作.TransportActionId是一种integer定义行动的类型.某些操作类型对于每个任务必须是唯一的,而有些则不是.
所以我需要一个类型约束:
UNIQUE ("TaskId", "TransportActionId")适用于所有动作TransportActionId != (2||3 || 4).
所以所有行动除了那些ActionId=2,3 or 4.
有任何想法吗?
在SQL Server中,我想在现有表中创建一个列,该列必须具有唯一属性,但有一个例外:"ship".该表可以包含每个元素的一个副本,但是当我一次又一次地插入"ship"时它应该没问题.我该如何管理?
sql ×4
oracle ×3
sql-server ×3
constraints ×1
database ×1
django ×1
indexing ×1
oracle10g ×1
postgresql ×1
python-3.x ×1
xsd ×1