如何使用Unique Composite Key

时间:2011-01-15 10:37:21

标签: database database-design

我有一张桌子

Item(ItemName*, ItemSize*, Price, Notes)

我正在制作(ItemName,ItemSize)的复合键以唯一标识项目。现在,在阅读了stackoverflow上的一些答案后,建议使用UNIQUE我将其修改为

Item(ItemID*, ItemName, ItemSize, Price, Notes)

但是如何在ItemName和ItemSize上应用UNIQUE约束

如果有问题

,请更正

3 个答案:

答案 0 :(得分:10)

ALTER TABLE Items ADD UNIQUE INDEX(ItemName, ItemSize);

here's an article解释了如何使用SQL Server Management Studio实现相同目的。

答案 1 :(得分:1)

  1. 您正忙于使用One Tool执行任务。不理解:

    • 正如Darin所说,在一天结束时,SQL是一种基于字符的语言
    • 任何和所有命令(数据操作,或本例中的数据定义),在SQL服务器上作为字符串执行
    • 有超过一百个GUI SQL Server管理工具,从MS每隔一年不断生产的垃圾,到成熟的产品,不断增长(未被替换或重写)
    • 你可以点击或拖动任何你使用的GUI,但是当你点击“保存”或“应用”按钮时,所有人都做同样的事情:将一个SQL字符串发送到SQL服务器进行处理

    因此,是的,如果要添加服务器或模型/实现数据库,则需要了解SQL命令级别发生的情况。否则,当您单击或拖动时,您将执行意外操作。

  2. SQL已经存在了30多年,它已经走过了漫长的道路(它仍然非常有限,但这与此无关)。在过去,我们只有 {DROP|CREATE} [UNIQUE] [CLUSTERED] INDEX name ON table (columns, ...)
    句法。随着它的扩展,增加了更多的关系构造,我们有了 ALTER TABLE table {ADD|DROP} {UNIQUE|PRIMARY KEY} CONSTRAINT name (columns,...)
    语法。

    Dave Pinal的观点是正确的:就服务器内部的数据存储结构而言,INDEXCONSTRAINT语法都会产生相同的结果,即索引。

    但他只是在回答一个问题,显然还没有听说过较新的CONSTRAINT语法中隐含的ISO / IEC / ANSI标准SQL特性,INDEX并未暗示这一点。语法(如果使用它,则必须明确指定这些参数)。更重要的是,INDEX语法中可以提供许多参数,这些参数在CONSTRAINT语法中不存在。因此存在显着差异,这可能与在默认状态下运行的小型服务器无关。

    通常,那些倾向于在物理层面上表现,或者有数百个表要管理的人使用INDEX语法;和那些与身体上的我们保持距离的人CONSTRAINT

    • 关键是,使用另一个XOR,不要使用组合:这会导致创建您甚至不知道的重复索引(因为它们不会显示在您正在查看的损坏的MS GUI面板中)。

    Dave混淆了一些事情:没有“主键索引”这样的东西。 要么主键约束索引(可能是主键,并且设置与支持PK相关)..

  3. 接下来会让任何人,初学者或其他人感到困惑的是,你习惯于看到各种有趣的绘画,这些绘画应该用来描绘数据或数据模型,但事实并非如此。 MS是最糟糕的罪犯,在每个不同的产品中,有一个完全不同的有趣图表和一组符号。没有共性或标准;有一些符号描绘了设计的重要方面,在一张图片中你可能想要在另一张图片中,你无法得到它。

    嗯,实际上有一个名为IDEF1X的关系数据库建模标准。但MS没有听说过它。这个想法是关于模型的标准,所有重要信息;细微之处;等,在单一模型中识别。许多不同的团队可以使用单一模型。当然,它有标准的符号和符号集。

    • 重点是,学习标准,它会为你清除很多困惑。然后,无论您今天在屏幕上使用什么GUI工具,您都会知道您在数据模型中明确想要/拥有什么,以及服务器内部发生了什么。

    • 点是,“我如何以图形方式执行此操作”,您可以在任何图表工具中执行此操作,因为您拥有该模型,并且您设置了选择表格上的设置。没有MS GUI曾经或者永远不会给你 。

    GUI不能代替知识。

  4. 您能解释一下:如果您声明,(ItemName, ItemSize)在该特定表格上形成一个唯一键,您认为您需要的基础是(ItemName, ItemSize,还有更多{{1} }}?如何才能获得比独一无二的独特性?

答案 2 :(得分:0)

ALTER TABLE Items ADD CONSTRAINT uc_name_size UNIQUE (ItemName,ItemSize)
来自oraclepostgres doc

引用