【问题标题】:Mysql unique field will not accept multiple nulls [closed]Mysql唯一字段将不接受多个空值[关闭]
【发布时间】:2013-06-15 15:03:16
【问题描述】:

我有一个包含 video_id 字段的表,该字段设置为唯一接受 NULL 值。但是它不会接受两个空值。表类型 InnoDB 或 MISAM 将不起作用。

这会在视频 _id(Null 值)上产生重复键错误:

INSERT INTO dances (name, video_id, level) VALUES ('abc', '', 'beg');

如果我正确阅读了 Mysql 规则,它应该这样做。谁能建议下一步去哪里?

【问题讨论】:

  • 显示您的创建表语句
  • 显示一个小例子(CREATE TABLEINSERT 几行)发生这种情况。您可以使用 sqlfiddle.com/
  • 您是否偶然在列中添加了DEFAULT x 属性?

标签: mysql sql null unique


【解决方案1】:

是的,MySQL 允许在具有唯一约束的列中使用多个 NULL。见this Stack Overflow question

空字符串''NULL 不同。

改用这个:

INSERT INTO dances (name, video_id, level) VALUES ('abc', NULL, 'beg');

【讨论】:

  • INSERT INTO dances( name, video_id, level) VALUES ('abc', '', 'beg') 这会在视频 _id (Null值)
  • @TerryWright 空字符串''NULL 不同。
  • @TerryWright:使用这个:INSERT INTO dances(name, video_id, level) VALUES ('abc', null, 'beg')
【解决方案2】:

你可以试试 BDB(我对此一无所知);更多信息请参见here

【讨论】:

  • 不知道更改底层引擎会启用此功能...
  • 这个参考似乎支持我的理解,即在 InnoDB 中多个 Null 应该可以工作。无论如何感谢您的参考。
【解决方案3】:

为什么你的表需要多行才能有一个空的 video_id?

从数据库设计的角度来看,您使用表建模的对象听起来太“大”,需要分解为主表和详细表。

您的选择是 (A) 删除 UNIQUE 约束,或 (B) 创建一个单独的表,其中包含 object_idvideo_id 对(where object_id主键 所在的位置你的main table)。

【讨论】:

  • 表格是一个非常简单的表格:- id,舞蹈名称,Video-id,舞蹈等级。 id 指的是舞蹈的 youtube 视频,但有些没有。实际上,我可以取消唯一约束,但我不明白为什么 Null 会产生重复键失败。根据Mysql信息应该没问题。感谢 cmets。
  • @TerryWright 从数据建模的角度来看,舞蹈表的每一行都描述了舞蹈的属性。当舞蹈有 0 个或更多其他东西时,这并不是舞蹈的真正属性,而是“有”关系,通常会得到一个单独的表格。也许在您正在开发的系统中,每个舞蹈只有 0 或 1 个视频,并且可能希望保持简单,但是数据建模者可能会说,嘿,一个舞蹈可以有很多视频,一个长视频也可以显示几个舞蹈,可能需要一个 (dance_id,video_id) 对的表,如所述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多