MySQL对列的唯一约束不允许插入多个空值和空字符串。ENGINE=InnoDB
MySQL对列的唯一约束不允许插入多个空值和空字符串。ENGINE=InnoDB
使用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了解到唯一约束允许空值。
请指导如何在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'; $insertData[] = $data_b[$i]; } else { echo '??? null??? '; $insertData[] = 'NULL'; } }
然后得到QLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'NULL' for key 'RegistrationNumber'
现在是什么问题?
需要将$insertData[] = 'NULL'
更改为$insertData[] = NULL;
最终一切都清楚了。谢谢回答。
MySQL唯一约束对列不允许插入多个空字符串或空值。这个问题的原因是,唯一约束要求每个值都是唯一的,而空字符串和空值是不同的。在唯一列中,不能有多个空字符串。
解决这个问题的方法是将空字符串和0转换为NULL。这样,就可以插入多个NULL值了。
以下是解决这个问题的代码示例:
ALTER TABLE your_table MODIFY your_column INT NULL; UPDATE your_table SET your_column = NULL WHERE your_column = 0; UPDATE your_table SET your_column = NULL WHERE your_column = ''; ALTER TABLE your_table MODIFY your_column INT NOT NULL;
这段代码首先修改表中的列,将其允许为NULL。然后,使用UPDATE语句将所有的空字符串和0值都转换为NULL。最后,再将列修改为不允许为NULL。
通过执行这些操作,就可以解决MySQL唯一约束对列不允许插入多个空字符串或空值的问题了。