NULL列上的MySQL唯一行为

时间:2010-12-16 09:42:56

标签: mysql

我有这张桌子

CREATE TABLE IF NOT EXISTS `profile_connections` (
  `id` int(11) NOT NULL auto_increment,
  `profile_id` int(11) NOT NULL,
  `connection_profile_id` int(11) NOT NULL,
  `created` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `deleted` timestamp NULL default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `profile_id_2` (`profile_id`,`connection_profile_id`,`deleted`),
  KEY `profile_id` (`profile_id`,`connection_profile_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

我的列上有一个独特的(profile_id,connection_profile_id,已删除)

现在希望能够使用 INSERT IGNORE INTO profile_connections SET profile_id = 2,connection_profile_id = 3

如果已存在值为profile_id = 2,connection_profile_id = 3且deleted = null

的行,我希望数据库“忽略”插入

但是表中没有看到“deleted = null”是相同的值,因此多行可以存在null值。

id | profile_id | connection_profile_id | created             | deleted
2  | 4          | 3                 | 2010-12-16 10:34:46 | NULL
3  | 4          | 3                 | 2010-12-16 10:34:53 | NULL

无论如何都要让桌子按照我的意愿运作。 或者是首先创建SELECT查询以查看某行是否已存在的唯一方法??

2 个答案:

答案 0 :(得分:1)

显然,这是InnoDB的设计。这是一个答案:http://forums.mysql.com/read.php?22,53591,53975#msg-53975

我相信他们建议你可以使用自定义值(如999999999)而不是NULL。或者可能是-1?

答案 1 :(得分:1)

它可能不是您想要做的,但显而易见的解决方案是不使用NULLable列。创建一个单独的已删除列,它是boolean / tinyint,用false / 0表示该行未被删除,或者在删除的时间戳中使用默认时间表示未删除的行。