【问题标题】:Creating Surrogate Key table with other unique constraints创建具有其他唯一约束的代理键表
【发布时间】:2016-08-22 21:56:55
【问题描述】:

我是自学的数据库设计和 MYSQL。谢谢你看我的问题。我目前在mySQL 中有一个类似这样的数据库:

我使用复合键的原因是我想让OwnerDevName 始终保持唯一。 我可以看到的一个问题是我需要一直使用两个外键,所以Data1 表没有被规范化。

所以我做了一个看起来像这样的表,再做一个有代理键表的表。

这看起来好吗?我不确定制作新表真的是个好主意...

是否有任何方法可以将它们放在具有代理键的单个表中,保持 OwnerDevName 的组合像这样唯一?:

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    Device3Data3 对我来说看起来不错。除非有一些令人信服的理由,否则我不会添加额外的表格。创建第三个表的任何令人信服的理由都可能归结为仅处理复合外键,就像在原始 Device/Data1 模型​​中一样。

    似乎缺少的只是 UNIQUE 约束。您可以在 ownerdevname 列的组合上添加唯一约束(即 UNIQUE INDEX)。例如

     CREATE TABLE device3 
     ( id       INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
     , owner    VARCHAR(30) NOT NULL COMMENT ''
     , devname  VARCHAR(30) NOT NULL COMMENT ''
     , ...
    
     , UNIQUE KEY device3_UX1 (owner, devname)
    
     ) ...
    

    或者,如果您已经创建了 device3 表,您可以添加一个唯一索引到现有表。例如

     CREATE UNIQUE INDEX device3_UX1 ON device3 (owner, devname) 
    

    【讨论】:

    • 感谢您的快速回复。哦,我认为该查询组合了 idownerdevname 唯一,但我不符合我的要求。但它实际上运作良好:) 谢谢。只是一个简单的问题,所以UNIQUE INDEXUNIQUE KEY 是相同的吗?没有区别吗?
    • 是的,在 MySQL 中相同。 (其他数据库区分唯一约束和唯一索引。例如,Oracle 允许使用非唯一索引强制执行唯一约束。但是(MySQL)InnoDB 存储引擎不会这样做。您需要创建一个唯一索引来强制执行唯一约束。在 MySQL 中,这两个语句是等效的:ALTER TABLE foo ADD CONSTRAINT foo_UX1 UNIQUE KEY (bar,baz)CREATE INDEX foo_UX1 ON foo (bar,baz)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多