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