2016-04-25 70 views
0

我有一个包含三个表的数据库; item,item_unit和单位。物品属于7个单位之一。创建这些表的方法如下:SQL Server 2012:如何使用where子句来防止重复记录

CREATE TABLE items 
( 
itemID int PRIMARY KEY, 
itemDefinition varchar (150) 
) 

CREATE TABLE units 
(
unitID int PRIMARY KEY, 
unitName varchar(25) 
) 

CREATE item_Units 
(
itemID int FOREIGN KEY REFERENCES items(itemID), 
unitID int FOREIGN KEY REFERENCES units(unitID), 
PRIMARY KEY(itemID, unitID) 
) 

该方案是,属于同一单元的项目不能具有相同的定义。我知道可以在表上创建索引和约束来限制重复,但是这样做有可能与此场景相关吗?

+0

项目定义不能存储在'Items'基表级别。这个唯一的定义是基于'Items'和'Units'之间的关系。它必须存储在与两者相关的桌子上,并且成为唯一键的一部分。你可能只有两张桌子。 'Items'应该具有'Units'的外键,并且链接表是不必要的。很确定这应该工作。 – BenM

回答

0

根据您的情况,该模式应该是这样的:

CREATE TABLE items 
( 
itemID int PRIMARY KEY, 
itemDefinition varchar (150) not null 
) 

CREATE TABLE units 
(
unitID int PRIMARY KEY, 
unitName varchar(25) not null 
) 

CREATE TABLE item_Units 
(
itemID int FOREIGN KEY REFERENCES items(itemID), 
unitID int FOREIGN KEY REFERENCES units(unitID), 
itemUnitDescription varchar(200) null, 
PRIMARY KEY(itemID, unitID) 
) 
create view items_with_units 
as 
select i.itemId,u.unitID, 
isnull(ui.itemUnitDescription,isnull(i.itemDescription,'')+ ' '+isnull(u.unitName,'')) Description 
from items i 
left join item_units ui on i.itemID=ui.itemID 
left join units u on u.unitID=ui.unitID 

这样select * from item_with_units会给你想要的东西。