使用其他唯一约束创建代理键表
问题描述:
我自学成功进行数据库设计和MYSQL。谢谢你看我的问题。我现在有一个数据库看起来像这样在mySQL
:使用其他唯一约束创建代理键表
我用一个组合键的原因是我要保持Owner
和DevName
唯一所有的时间。 我可以看到的一个问题是,我需要始终使用两个外键,所以Data1
表未标准化。
所以我做了一个表,看起来像这样,使另一个表具有代理键表。
这看起来好吗?我不知道做新表确实是个好主意......
有什么让他们在具有代理键一个表,保持的Owner
和DevName
独特的像这样的组合?:
答
该Device3
和Data3
看起来不错。除非有一些令人信服的理由,否则我不会添加额外的表格。创建第三张表的任何令人信服的理由可能归结为处理复合外键,就像在原始的Device/Data1模型中一样。
看来所有缺少的是UNIQUE约束。您可以在owner
和devname
列的组合上添加UNIQUE约束(即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)
感谢您的快速回复。噢,我认为这个查询使'id','owner'和'devname'具有独特的组合,我不符合我的要求。但它实际上效果不错:)谢谢。 只是一个简单的问题,所以'UNIQUE INDEX'和'UNIQUE KEY'是相同的吗?没有区别? –
是的,在MySQL中完全相同。 (其他数据库区分了唯一的CONSTRAINT和唯一的INDEX,例如,Oracle允许使用非唯一索引强制执行一个唯一的约束,但(MySQL)InnoDB存储引擎不会这样做,您需要创建一个在MySQL中,这两个语句是等价的:'ALTER TABLE foo ADD CONSTRAINT foo_UX1 UNIQUE KEY(bar,baz)'和'CREATE INDEX foo_UX1 ON foo(bar,baz)' – spencer7593
非常感谢许多! –