MySQL Column的唯一约束不允许插入多个Null和空。 ENGINE = InnoDB的

时间:2013-08-09 10:29:32

标签: mysql

使用SHOW CREATE TABLE获取以下信息

 (      
  `Number` int(11) NOT NULL AUTO_INCREMENT,
  `CompanyName` char(255) COLLATE utf8_unicode_ci NOT NULL,
  `RegistrationNumber` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,

   UNIQUE KEY `Number_2` (`Number`),
   UNIQUE KEY `CompanyName` (`CompanyName`),
   UNIQUE KEY `RegistrationNumber` (`RegistrationNumber`)

 ) ENGINE=InnoDB AUTO_INCREMENT=280 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

RegistrationNumber中需要允许插入多个NULL和空值。

但是会收到错误Integrity constraint violation: 1062 Duplicate entry '' for key 'RegistrationNumber'

这里http://forums.mysql.com/read.php?22,53591,53591读取InnoDB的NULL不被视为唯一值。

这里https://stackoverflow.com/a/1346776/2465936读取Unique约束允许空值。

请建议如何在RegistrationNumber中插入多个空值我是否需要更改RegistrationNumber varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,中的内容?

或者使用ENGINE=InnoDB这是不可能的?改为MyISAM。同样的错误...

更新

哦......疯了

$sql = "INSERT INTO 18_6_TransactionPartners (RegistrationNumber) VALUES";

$insertQuery = array();
$insertData = array();

foreach ($num_row_1 as $i => $row) {
$insertQuery[] = '(?)';

if ( (strlen($data_b[$i])) > 0 ) {
echo '(strlen($data_b[$i])) > 0<br>';
$insertData[] = $data_b[$i];
}
else {
echo '??? null??? <br>';
$insertData[] = 'NULL';
}
}

获取QLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'NULL' for key 'RegistrationNumber'

现在有什么问题?

需要将$insertData[] = 'NULL'更改为$insertData[] = NULL;

最后一切都很清楚。谢谢你的回答

2 个答案:

答案 0 :(得分:3)

正如你所说,

It should work

但是看起来你插入一个空字符串而不是null到你的列中。那是不同的。您不能在唯一列中包含多个空字符串。

0不是null0是一个零值。但null表示值。

答案 1 :(得分:1)

Unique Constraint允许多个Null值。在数据库上下文中,空值实际上意味着Null,因为空字符串(或数字零等)是完全已知的值。 您可以做的是使用NULLIF function并将空字符串替换为空(即Nullif(myValue,''