我有一个我想要独特的电子邮件专栏.但我也希望它接受空值.我的数据库可以通过这种方式发送2封空邮件吗?
题
是否可以使用流畅的语法或属性在属性上定义唯一约束?如果没有,有哪些解决方法?
我有一个带有主键的用户类,但我想确保电子邮件地址也是唯一的.这是否可以直接编辑数据库?
解决方案(基于马特的答案)
public class MyContext : DbContext {
public DbSet<User> Users { get; set; }
public override int SaveChanges() {
foreach (var item in ChangeTracker.Entries<IModel>())
item.Entity.Modified = DateTime.Now;
return base.SaveChanges();
}
public class Initializer : IDatabaseInitializer<MyContext> {
public void InitializeDatabase(MyContext context) {
if (context.Database.Exists() && !context.Database.CompatibleWithModel(false))
context.Database.Delete();
if (!context.Database.Exists()) {
context.Database.Create();
context.Database.ExecuteSqlCommand("alter table Users add constraint UniqueUserEmail unique (Email)");
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用SQL Server 2005.我想将列中的值限制为唯一,同时允许NULLS.
我当前的解决方案涉及视图上的唯一索引,如下所示:
CREATE VIEW vw_unq WITH SCHEMABINDING AS
SELECT Column1
FROM MyTable
WHERE Column1 IS NOT NULL
CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)
Run Code Online (Sandbox Code Playgroud)
有更好的想法吗?
在使用Code First的EF 6.1中,您可以使用实体中的属性创建索引,或者使用以下行中的流畅API:
Property(x => x.PropertyName)
.IsOptional()
.HasMaxLength(450)
.HasColumnAnnotation("Index",
new IndexAnnotation(new IndexAttribute("IX_IndexName") {IsUnique = true, }));
Run Code Online (Sandbox Code Playgroud)
是否有任何方式WHERE PropertyName IS NOT NULL可以像在SQL Server中一样以原样的方式表示脚手架(参见:https://stackoverflow.com/a/767702/52026)?
我有一个表,我需要强制列具有唯一值.此列必须是可空的,并且应该允许业务逻辑使用多个NULL值,而其他重复值则不允许.
SQL Server UNIQUE约束在这种情况下并不好,因为它将NULL视为常规值,因此它将拒绝重复的NULL.
目前,BLL授予了价值唯一性,所以我不是在寻找一个肮脏的黑客来使其发挥作用.我只是想知道是否有一个干净的解决方案来在DB中强制执行此约束.
是的,我知道我可以写一个触发器来做到这一点:触发器是唯一的解决方案吗?(或者最好的解决方案呢?)
我试图在表中的两个字段上创建一个唯一约束.但是,很可能一个人将为空.如果两者都不为null(name永远不会为null),我只要求它们是唯一的.
create unique index "name_and_email" on user(name, email);
Run Code Online (Sandbox Code Playgroud)
忽略表和字段名称的语义以及这是否有意义 - 我只是做了一些.
有没有办法在这些字段上创建一个唯一约束,它将强制两个非空值的唯一性,但如果有多个条目name不为null并且email为null ,则忽略它?
这个问题适用于SQL Server,我希望答案不一样: 如何创建一个也允许空值的唯一约束?
我正在使用:Spring 4,Hibernate 4,SQL Server 2008
我知道如何使用SQL Server 2008从这个问题响应中如何创建一个也允许空值的唯一约束?
但是由于我在创建表时没有生成任何手动SQL代码,是否可以通过我的Entity类中的Hibernate注释在我的约束中生成"where子句"?
我的DDL是从头创建的,具有java实体定义,如下所示:
@Entity
@Table(name="Neighborhood",
uniqueConstraints = {@UniqueConstraint(columnNames = {"codecnbv","zipcode"})})
@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
public class Neighborhood implements Serializable {
private String id;
private String codecnbv;
private String zipcode;
@Id
@Column(name="id", nullable=false, unique=true, length=2)
public String getId() {
return this.id;
}
@Column(name="codecnbv", nullable=true, length=12) //explicitly nullable
public String getCodecnbv() {
return codecnbv;
}
@Column(name="zipcode", nullable=true, length=5) //explicitly nullable
public String getZipcode() {
return zipcode;
}
Run Code Online (Sandbox Code Playgroud)
}
但是,只要我添加数据并尝试在列codecnbv和/或zipcode中输入NULL的第二条记录,我就会收到一个异常,说我违反了唯一约束.
我要求我必须允许多个空值,当值不为空时,我应该有唯一的值,即
对于zipcode列
我有一个包含列的表:
Id int
Name varchar *
Description varchar
LevelId int *
DeletedAt datetime nullable *
Run Code Online (Sandbox Code Playgroud)
我想对上面标有星号的字段有一个唯一的约束:Name、LevelId、DeletedAt。我添加DeletedAt作为约束的原因是,当有人软删除并添加具有相同Name和LevelId的新记录时,数据库将允许添加。但我错误地认为不允许有 2 行具有相同的 Name、LevelId,并且 DeletedAt 均为 NULL,因为 NULL 不等于 NULL。
我需要的是一个替代方案。我怎样才能支持这个要求?我能想到的一件事是将DeletedAt替换为varchar,然后它有一个默认值,例如“Active”或一个空字符串(只是不为空),然后将日期作为已删除行的字符串。但我在想是否有更优雅的解决方案。
我有 3 个类是:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class Tag {
@Id
private String id;
private String name;
}
@Entity
@Table(uniqueConstraints=
@UniqueConstraint(columnNames={"name"}))
public class SystemTag extends Tag {
}
@Entity
@Table(uniqueConstraints=
@UniqueConstraint(columnNames = {"name", "user"}))
public class CustomTag extends Tag{
@ManyToOne
private User user;
}
Run Code Online (Sandbox Code Playgroud)
所以我想对系统标签使用唯一名称,对自定义标签使用唯一名称-用户对(多个用户可以创建相同的标签)但我收到两个警告,如下所示:
<timestamp> WARN AnnotationBinder:601 - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: <domain>.CustomTag
<timestamp> WARN AnnotationBinder:601 - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: <domain>.SystemTag
Run Code Online (Sandbox Code Playgroud)
它允许我为同一用户创建两个同名的系统标签和两个同名的自定义标签。 …
create table test3
(
id int PRIMARY KEY,
id2 int
);
create unique index ndx_id2 on test3 (id2);
Run Code Online (Sandbox Code Playgroud)
出于唯一索引的目的,所有NULL值都被认为与所有其他NULL值不同,因此是唯一的.这是SQL-92标准的两种可能解释之一(标准中的语言含糊不清),并且是PostgreSQL,MySQL,Firebird和Oracle的解释.
Informix和Microsoft SQL Server遵循该标准的其他解释.
INSERT INTO test3(id, id2) VALUES (1, null);
INSERT INTO test3(id, id2) VALUES (2, null);
Run Code Online (Sandbox Code Playgroud)
第二次INSERT返回
无法将重复值插入唯一索引.[表名= test3,约束名= ndx_id2]
SQL Server出错但成功将记录添加到另一个DBMS,例如Sqlite.
如何在具有唯一约束的字段中允许在SQL Server中输入大量空值?
我的表中有 2 个字段,IDProvider 和引用。表是这样的:
ID
MyOwnReference
IDProvider
Reference
Run Code Online (Sandbox Code Playgroud)
我希望如果 IDProvider 和 Reference 都不为空,则约束应该检查是否有重复,因为提供者不能有重复的引用。但是,如果其中至少一个为空,我想避免检查。因为我可以知道提供者但不知道参考,或者我可以知道参考但不知道提供者(我接受这可能有点奇怪,如果我知道参考,我必须知道提供者)。但无论如何,我想处理这种可能性。
我试图创建一个唯一索引,但是当我尝试添加第二条记录时,IDProvider 和 Reference 为空,我收到一个错误,该值是重复的,因为存在一个具有空值的索引,空值。
我正在使用 Sql Server 2017 express。
另一种选择是拥有一个 [Unkown] 提供者并为他分配一个虚拟引用,但这让我向我的应用程序添加更多逻辑来确定它不是重复的引用。
无论如何,我可以接受想法,因为我可以改变这种行为,这不是问题,如果真的是一个带有空值的索引,这是一个非常糟糕的主意。
谢谢。
sql-server ×7
sql ×3
database ×2
hibernate ×2
indexing ×2
java ×2
c# ×1
code-first ×1
constraints ×1
ddl ×1
jpa ×1
mysql ×1
oracle ×1
primary-key ×1
terminology ×1
unique ×1