2009-01-14 118 views
63

我在拼凑一个图片网站。基本模式的MySQL非常简单,但在尝试表示与图像相关的可能管理标志(“不适当”,“受版权保护”等)时遇到了一些麻烦。我现在的想法是:MySQL外键允许NULL?

tblImages (
    imageID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    ... 
); 

tblImageFlags (
    imageFlagID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    imageID INT UNSIGNED NOT NULL, 
    flagTypeID INT UNSIGNED NOT NULL, 
    resolutionTypeID INT UNSIGNED NOT NULL, 
    ... 
); 

luResolutionTypes (
    resolutionTypeID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    resolutionType VARCHAR(63) NOT NULL, 
    ... 
); 

(截断为了便于阅读;各类外键和索引是为了,我发誓)的标志类型的查找表

tblImageFlags.flagTypeID被国外键控,并且你可以想象得到tblImageFlags.resolutionTypeID应该luResolutionTypes.resolutionTypeID上被外键。现在的问题是,当一个标志首次发布时,没有逻辑分辨率类型(我会声明这是一个很好用的NULL);但是,如果设置了值,则应该对查找表进行外键。

我找不到这种情况下的MySQL语法解决方法。它存在吗?最好的亚军是:

  • 添加一个“非审”的决议类型
  • 添加NULL进入luResolutionTypes.resolutionTypeID(会这样即使在AUTO_INCREMENT列工作?)

感谢您的见解!

PS奖金指向任何人告诉我,在数据库的情况下,它是“索引”还是“索引”。


后续:(!如果你想让它允许NULL没有设置NOT NULL列)感谢比尔Karwin指点出了什么竟然是在表结构中的语法错误。一旦我有足够的业力给你这些奖励积分,我会:)

回答

96

你可以解决这个问题,允许NULL在外键列tblImageFlags.resolutionTypeID


PS奖励积分给谁就给谁告诉我是否在数据库的情况下,它的“指数”或“指数”。

指数的复数应索引

据 “Modern American Usage”,由布赖恩·A·加纳:

对于普通的目的,索引是 优选多个,不指数。 ... 指数,比论坛教理, 是自命不凡不过虽然不太装腔作势。 一些作者喜欢指数在 技术上下文,如在数学 和科学。虽然不是最好的 复数索引,索引是 允许在意义上的“指标”。 ... 避免单数指数,从复数指数的回编。

+4

你如何处理不允许为NULL的主键列的外键?这是一个多年来一直困扰我的应用程序的问题,有时我最终会使用0,或者说前面的外键关系,但这不是最优的。 – glyph 2013-02-13 00:18:57