Share via


unique ("M" Keywords)

[This content is no longer valid. For the latest information on "M", "Quadrant", SQL Server Modeling Services, and the Repository, see the Model Citizen blog.]

The unique keyword declares that a particular field or set of fields is unique within a collection. The unique constraint can be placed directly on an entity declaration or it can be placed on an extent that contains the entity.

Syntax

unique field name

or

unique **(**field name1, field name2,…. field nameN)

The unique constraint is specified as one of the clauses in a where constraint. If the unique constraint is the last clause in the where constraint, then it must be terminated with a ;.

Examples

Single Unique Field

The following shows how to specify a single field as unique. It stipulates that the Name field within each member of the Categories collection is distinct.

Categories : Category* where unique Name;

Set of Unique Fields

If multiple fields are not individually unique, but taken together are unique, this can be stated by listing the fields in a unique constraint. In the following, the contacts collection has multiple people with the same name and multiple people can live at the same address, however, it is not possible to store the same address for the same person twice.

module Contacts
{
    type Contact 
    {
        Person : Text#128;
        Address : Text#128;
        Phone: Text;
    }
    Contacts1 : Contact* where unique (Person, Address);
}

Constraint on the Entity

The unique constraint can be placed directly on an entity declaration.

module Contacts
{
    type Contact 
    {
        Person : Text#128;
        Address : Text#256;
    } where unique Person;
    
    Contacts2 : Contact*;
}

This is equivalent to placing the constraint on each specific collection the entity is a member of. Placing the constraint on the entity (rather than on the collections the entity is a member of) only implies uniqueness within individual collections, not uniqueness across all possible collections. So, for example, Contacts2 can contain elements with the same value in the Name property as Contacts1 does.

Differences between the Unique and Identity Constraints

The two constraints both require that no duplicate values exist for the specified field or fields. However, the unique constraint permits one entity in the extent to have a null value for the specified field, whereas this is not allowed for the identity constraint.

Unique Value

Collections in “M” can contain multiple copies of the same element. The constraint unique value specifies that there are no duplicate elements in a collection.

The following code ensures that every member of Contacts is unique, in that there is never more than one name living at an address with the same phone number.

module Contacts
{
    type Contact 
    {
        Name: Text;
        Address : Text;
        Phone: Text;
    }
    Contacts : Contact* where unique value;
}