I have a table with the following definition:

```
CREATE TABLE url_tracker (
    id int not null identity(1, 1),
    active bit not null,
    install_date int not null,
    partner_url nvarchar(512) not null,
    local_url nvarchar(512) not null,
    public_url nvarchar(512) not null,
    primary key(id)
);

```

And I have a requirement that these three URLs always be unique - any individual URL can appear many times, but the combination of the three must be unique (for a given day).

Initially I thought I could do this:

```
CREATE UNIQUE INDEX uniques ON url_tracker 
(install_date, partner_url, local_url, public_url);

```

However this gives me back the warning:

```
Warning! The maximum key length is 900 bytes. The index 'uniques' has maximum
length of 3076 bytes. For some combination of large values, the insert/update
operation will fail.

```

Digging around I learned about the `INCLUDE` argument to `CREATE INDEX`, but according to [this question](https://stackoverflow.com/questions/906603/unique-indexes-and-include-statements) converting the command to use `INCLUDE` will not enforce uniqueness on the URLs.

```
CREATE UNIQUE INDEX uniques ON url_tracker (install_date)
INCLUDE (partner_url, local_url, public_url);

```

How can I enforce uniqueness on several relatively large nvarchar fields?

---

Resolution
==========

So from the comments and answers and more research I'm concluding I can do this:

```
CREATE TABLE url_tracker (
    id int not null identity(1, 1),
    active bit not null,
    install_date int not null,
    partner_url nvarchar(512) not null,
    local_url nvarchar(512) not null,
    public_url nvarchar(512) not null,
    uniquehash AS HashBytes('SHA1',partner_url+local_url+public_url) PERSISTED,
    primary key(id)
);
CREATE UNIQUE INDEX uniques ON url_tracker (install_date,uniquehash);

```

Thoughts?