Sql 具有空组件的复合id的唯一性
我在使用唯一约束时遇到问题。 允许以下组合Sql 具有空组件的复合id的唯一性,sql,grails,unique,gorm,constraints,Sql,Grails,Unique,Gorm,Constraints,我在使用唯一约束时遇到问题。 允许以下组合 A.name B.name foo NULL foo bar foo bar1 foo1 bar 只有在具有不同的B时,才可能创建具有相同名称的新a。 使用下面的约束,可以创建 A.name B.name foo NULL foo NULL 因为NULL似乎对unique没有影响 有什么提示可以解决这个问题吗 class A { String name static belongsTo = [b:
A.name B.name
foo NULL
foo bar
foo bar1
foo1 bar
只有在具有不同的B时,才可能创建具有相同名称的新a。
使用下面的约束,可以创建
A.name B.name
foo NULL
foo NULL
因为NULL似乎对unique没有影响
有什么提示可以解决这个问题吗
class A {
String name
static belongsTo = [b:B]
static constraints = {
name(unique:'b')
b(nullable:true)
}
}
class B {
String name
static hasMany = [as:A]
name(unique:true)
}
在数据库结构中,是否可以将列设置为
非空默认值0
或类似值,然后将零视为与处理空值相同的值?由于该列是用于名称的,因此值中可能没有数字,对吗?我不完全确定,但我认为这会起作用:
name(unique:['b', 'name'])
查看代码中的唯一约束,这似乎是可行的。该约束绝对允许您传入一个要与唯一性进行比较的事物列表。它称之为uniquenessGroup。然后,在验证时,它会在这个列表上迭代。从这里的第137行开始看:
代码如下所示:
if(shouldValidate) {
Criteria criteria = session.createCriteria( constraintOwningClass )
.add( Restrictions.eq( constraintPropertyName, propertyValue ) );
if( uniquenessGroup != null ) {
for( Iterator it = uniquenessGroup.iterator(); it.hasNext(); ) {
String propertyName = (String) it.next();
criteria.add(Restrictions.eq( propertyName,
GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(target, propertyName)));
}
}
return criteria.list();
}
因此,这取决于GrailsClassUtils.GetPropertyYorStaticPropertyYorFieldValue调用是否检索同一类中的属性。基于它的名字,它看起来应该是这样的
我很想知道它是否对你有用。
你使用的是哪种RDBMS(?),MySQL,但是问题是要在GRAILS中解决,它对DimaSnalUn值INTION关键组件的约束会给你带来严重的麻烦:请考虑不要在关键组件中允许NULL值。认真考虑:不要在关键组件中允许空值(或至少一个Oracle)RDBMS对待<代码> '/COD>作为<代码> null <代码>。上面的类定义在SQL中转换为什么?我们能看看表格定义吗?不,那不行。仍然可以创建两个与B同名且为NULL的A