Groups | Blog | Home
all groups > sql server (alternate) > october 2005 >

sql server (alternate) : unique constraint to a column from another table


uw_badgers NO[at]SPAM email.com
10/28/2005 5:18:44 PM
Is it possible to create a unique constraint to a column from another
table? For example:

tb_current:
current_names
--------------
aaa
bbb

tb_new:
new_name
--------
ccc

Now I want to create a constraint on tb_new.new_name to be unique with
respect to tb_current.current_names. However, tb_new.new_name should
not be unique to itself. So I should not be able to insert 'aaa' to
tb_new.new_name. But I should be able to insert 'ccc' to
tb_new.new_name.

Here's the script to reproduce this example:

create table tb_current
(
current_names varchar(10)
)
create table tb_new
(
new_name varchar(10)
)
insert tb_current values ('aaa')
insert tb_current values ('bbb')
insert tb_new values ('ccc')

select * from tb_current
select * from tb_new

insert tb_new values ('aaa') -- this should NOT be allowed
insert tb_new values ('ccc') -- this should be allowed
Tom Moreau
10/28/2005 8:33:12 PM
It's hard to understand your spec. Is it that what you want is that any
new_name that you insert into tb_new does not exist in tb_current? If so, a
trigger will do it:

create trigger triu_tb_new on tb_new after insert, update
as
if @@ROWCOUNT = 0
return

if exists (select * from inserted i
join tb_current c on c.current_names = i.new_name)
begin
raiserror ('Names exist in tb_current.', 16, 1)
rollback tran
end
go

You can put a similar trigger on tb_current:

create trigger triu_tb_new on tb_new after insert, update
as
if @@ROWCOUNT = 0
return

if exists (select * from inserted i
join tb_new_name n on i.current_names = n.new_name)
begin
raiserror ('Names exist in tb_new_name.', 16, 1)
rollback tran
end
go

--
Tom

----------------------------------------------------
Thomas A. Moreau, BSc, PhD, MCSE, MCDBA
SQL Server MVP
Columnist, SQL Server Professional
Toronto, ON Canada
www.pinpub.com
..
[quoted text, click to view]
Is it possible to create a unique constraint to a column from another
table? For example:

tb_current:
current_names
--------------
aaa
bbb

tb_new:
new_name
--------
ccc

Now I want to create a constraint on tb_new.new_name to be unique with
respect to tb_current.current_names. However, tb_new.new_name should
not be unique to itself. So I should not be able to insert 'aaa' to
tb_new.new_name. But I should be able to insert 'ccc' to
tb_new.new_name.

Here's the script to reproduce this example:

create table tb_current
(
current_names varchar(10)
)
create table tb_new
(
new_name varchar(10)
)
insert tb_current values ('aaa')
insert tb_current values ('bbb')
insert tb_new values ('ccc')

select * from tb_current
select * from tb_new

insert tb_new values ('aaa') -- this should NOT be allowed
insert tb_new values ('ccc') -- this should be allowed
David Portas
10/29/2005 1:16:17 PM
[quoted text, click to view]

I suspect it would be a mistake to implement it that way, although in
prinicple you could do so through triggers.

Why not just have one table for the common "Name" attribute and a unique key
for that column. Add an extra column to distinguish between "current" and
"new" names if that distinction is important.

--
David Portas
SQL Server MVP
--

AddThis Social Bookmark Button