如何在hibernate POJO上实现我的独特约束?假设数据库不包含任何数据库.
我已经看到了@Column()注释中的唯一属性,但我无法让它工作?
如果我想将此约束应用于多个列,该怎么办?
我注意到我可以在具有UNIQUE约束的列中具有NULL值: UNIQUE(col)
这会在某些情况下产生任何问题吗?
我试图在多个表中创建一个唯一约束.我在这里找到了类似的问题,但是他们并没有完全捕捉到我想要做的精神.
作为一个例子,我有三个表,t_Analog,t_Discrete,t_Message
CREATE TABLE t_Analog(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [float] NOT NULL,
CONSTRAINT [uc_t_Analog] UNIQUE(AppName, ItemName)
)
CREATE TABLE t_Discrete(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [bit] NOT NULL,
CONSTRAINT [uc_t_Discrete] UNIQUE(AppName, ItemName)
)
CREATE TABLE t_Message(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [nvarchar](256) NOT NULL,
CONSTRAINT [uc_t_Message] UNIQUE(AppName, ItemName)
)
Run Code Online (Sandbox Code Playgroud)
我的目标是在所有3个表中使AppName和ItemName唯一.例如,应用程序X中的项目名称Y不能同时存在于模拟和离散表中.
请注意,这个例子是设计的,每个Type的实际数据是不同的,大到足以组合表并添加一个非常难看的Type列.
如果您对此方法有任何建议,我很乐意听到他们的意见!
----开始编辑2012-04-26 13:28 CST ----
谢谢大家的答案!
似乎可能有理由修改此数据库的架构,这很好.
将表组合到单个表中实际上并不是一个可行的选项,因为每个类型的列数量不超过30个(不幸的是,修改这些列不是一个选项).这可能导致每行中没有使用大部分列,这似乎是一个坏主意.
添加第4个表,如John Sikora和其他人提到的,可能是一个选项,但我想首先验证这一点.
修改架构为:
CREATE TABLE t_AllItems(
[id] [bigint] …Run Code Online (Sandbox Code Playgroud) 我的应用程序很少,允许用户对视频进行评级.
用户只能评价一次.所以我已经定义了模型的唯一性.
但他应该能够改变他的比率.所以save()应该更新重复键
class VideoRate(models.Model):
"""Users can Rate each Video on the criterias defined for the topic"""
user = models.ForeignKey(User)
video = models.ForeignKey(VideoFile)
crit = models.ForeignKey(VideoCrit)
rate = models.DecimalField(max_digits=2, decimal_places=1, choices=RATE_CHOICES)
class Meta:
unique_together = (('user', 'video', 'crit'),)
verbose_name = 'Video Rating'
Run Code Online (Sandbox Code Playgroud)
如果我
rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=2)
rate.save()
Run Code Online (Sandbox Code Playgroud)
它正在保存评级,但如果我
rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=3)
rate.save()
Run Code Online (Sandbox Code Playgroud)
我得到了正常的错误
IntegrityError: (1062, "Duplicate entry '1-1-1' for key 'user_id'")
Run Code Online (Sandbox Code Playgroud)
即使我使用force_update=True(因为仅基于主键)
有没有办法更新评级,如果它已经存在而不必检查之前的数据?
我在Oracle数据库表中有行,对于两个字段的组合应该是唯一的,但是没有在表上设置唯一约束,所以我需要使用SQL找到所有违反约束的行.不幸的是,我的微薄SQL技能无法胜任.
我的表有三列相关:entity_id,station_id和obs_year.对于每一行,station_id和obs_year的组合应该是唯一的,我想通过SQL查询将它们刷出来查明是否存在违反此行的行.
我尝试了以下SQL(由前一个问题提出),但它对我不起作用(我得到ORA-00918列模糊定义):
SELECT
entity_id, station_id, obs_year
FROM
mytable t1
INNER JOIN (
SELECT entity_id, station_id, obs_year FROM mytable
GROUP BY entity_id, station_id, obs_year HAVING COUNT(*) > 1) dupes
ON
t1.station_id = dupes.station_id AND
t1.obs_year = dupes.obs_year
Run Code Online (Sandbox Code Playgroud)
有人可以建议我做错了什么,和/或如何解决这个问题?
我有一个表'users','login'列定义为:
[login] VARCHAR(50) UNIQUE NOT NULL
Run Code Online (Sandbox Code Playgroud)
现在我想使用SQL脚本删除这个唯一的约束/索引.我在我的本地数据库中找到了它的名字UQ_ users _7D78A4E7,但我想它在另一个数据库上有一个不同的名字.
放弃这种独特约束的最佳方法是什么?或至少任何......
谢谢.
sql database sql-server-2005 unique-constraint non-clustered-index
我有一个基本的"用户"表,我想在MySQL中创建.
我不希望在数据库中出现重复的电子邮件或重复的用户名.
1. UNIQUE(用户名),UNIQUE(电子邮件),
2. UNIQUE KEY(用户名),UNIQUE KEY(电子邮件),
3. CONSTRAINT ucons_login UNIQUE(用户名,电子邮件),
我假设其中一些是同义词,但我一直在网上阅读相互矛盾的信息并且正在寻求确认.
我希望有人可以提供帮助.
SQL:
CREATE TABLE users (
user_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(30) NOT NULL,
pass CHAR(40) NOT NULL,
first_name VARCHAR(20) NOT NULL,
last_name VARCHAR(40) NOT NULL,
email VARCHAR(60) NOT NULL,
registration_date DATETIME NOT NULL,
user_level TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
active CHAR(32),
PRIMARY KEY (user_id),
UNIQUE (username),
UNIQUE (email),
INDEX login (email, pass),
INDEX full_name (last_name, first_name)
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud) 想知道Entity Framework 5是否支持对实体属性的唯一约束?如果是这样,我如何指定属性应该是唯一的?
我的数据库包含一个用户表.每个活跃用户都有唯一的用户名.我希望能够停用用户并释放他们正在使用的用户名,但将它们保存在同一个表中.
有没有办法只有条件地强制执行唯一性约束?
我正在创建一个包含3列的链接表; id,product_id,tournament_id.
将uniqueConstraint添加到"id"列是微不足道的,但我想确保任何一对(product_id,tournament_id)都是唯一的.
Liquibase.org上的例子显示
<changeSet author="liquibase-docs" id="addUniqueConstraint-example">
<addUniqueConstraint catalogName="cat"
columnNames="id, name"
constraintName="const_name"
deferrable="true"
disabled="true"
initiallyDeferred="true"
schemaName="public"
tableName="person"
tablespace="A String"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
但是有可能在一个<createTable>街区内完成吗?
另外,只是为了确认; 这会在两列上创建复合唯一约束,还是会创建两个独立的唯一约束?