Mysql向在insert中跳过的col添加NULL,并且col是唯一的

Mysql向在insert中跳过的col添加NULL,并且col是唯一的,mysql,sql,Mysql,Sql,我正在尝试添加流动的insert: INSERT INTO `user` (`name`, `family`, `status`, `mobile`, `ip`, `lastIp`, `seenTime`, `createTime`, `updateTime`) VALUES ('Mehdi Abbasi', NULL, 4, '989197659980', '149.154.167.210', '149.154.167.210', 1507650436, 1507650436, 15

我正在尝试添加流动的
insert

INSERT INTO `user` 
(`name`, `family`, `status`, `mobile`,  `ip`, `lastIp`, `seenTime`, `createTime`, `updateTime`) 
VALUES 
('Mehdi Abbasi', NULL, 4, '989197659980',  '149.154.167.210', '149.154.167.210', 1507650436, 1507650436, 1507650436)
在数据库中,我有:

数据库中家庭另存为
Null
的空值,这没有问题,但跳过了由
Null
填充的类似
email
的COL,并且在尝试添加另一个用户时,忽略了email,从数据库中获取重复密钥错误

注意:
电子邮件
字段具有唯一键

这个问题很奇怪,因为它在过去是有效的

表架构为:

CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `passwordResetToken` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `family` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `email` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `mobile` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `status` smallint(1) NOT NULL DEFAULT '1',
  `ip` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `lastIp` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `seenTime` int(20) DEFAULT NULL,
  `updateTime` int(20) DEFAULT NULL,
  `createTime` int(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


--
-- Indexes for table `user`
--
ALTER TABLE `user`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `email` (`email`),
  ADD UNIQUE KEY `mobile` (`mobile`),
  ADD UNIQUE KEY `passwordResetToken` (`passwordResetToken`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `user`
--
ALTER TABLE `user`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
例如
passwordResetToken
email
give
NULL
family
不是。
family
col make没有问题,但是
email
make.

最可能的答案是您使用默认值将
user.email
列创建为
NOT NULL

如果您确实希望在
user.email
列上有一个唯一的索引,并允许多行没有
email
值,那么您需要更改表以使
user.email
列允许
NULL

下面是一个使用您的模式的示例,演示如何成功添加多个具有
NULL
email
值的行,尽管索引是唯一的:

mysql > CREATE TABLE `user` (
    ->   `id` int(11) NOT NULL,
    ->   `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    ->   `passwordResetToken` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    ->   `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
    ->   `family` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    ->   `email` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    ->   `mobile` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    ->   `status` smallint(1) NOT NULL DEFAULT '1',
    ->   `ip` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    ->   `lastIp` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    ->   `seenTime` int(20) DEFAULT NULL,
    ->   `updateTime` int(20) DEFAULT NULL,
    ->   `createTime` int(20) DEFAULT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.02 sec)

mysql > alter table user add unique index email (email);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql > insert into user (id,password,name) values (1,'foo','foo');
Query OK, 1 row affected (0.02 sec)

mysql > insert into user (id,password,name) values (2,'foo','foo');
Query OK, 1 row affected (0.01 sec)

mysql [localhost] {msandbox} (test) > select * from user;
+----+----------+--------------------+------+--------+-------+--------+--------+------+--------+----------+------------+------------+
| id | password | passwordResetToken | name | family | email | mobile | status | ip   | lastIp | seenTime | updateTime | createTime |
+----+----------+--------------------+------+--------+-------+--------+--------+------+--------+----------+------------+------------+
|  1 | foo      | NULL               | foo  | NULL   | NULL  | NULL   |      1 | NULL | NULL   |     NULL |       NULL |       NULL |
|  2 | foo      | NULL               | foo  | NULL   | NULL  | NULL   |      1 | NULL | NULL   |     NULL |       NULL |       NULL |
+----+----------+--------------------+------+--------+-------+--------+--------+------+--------+----------+------------+------------+
2 rows in set (0.00 sec)

问题的原因有两方面:

1) 您确实允许为
电子邮件插入空值。
这本身并不是错误的原因,正如您可以看到的那样,
Family
列没有任何问题

2) 另一方面,您要求列
email
具有唯一的值。 这就是允许空值的收缩。 我不确定您是否能够在
电子邮件
中插入至少一条空记录,但多次插入空记录将在重复的“值”上触发错误


所以:不要让您的应用程序在
电子邮件中插入null

我最终解决了我的问题,方法是添加数据库并再次创建它,然后在其中插入备份行


我根本不知道为什么会发生这个问题

请将表的创建代码添加到问题中。是否可以添加表架构?由于
NULL
不等于或不等于
NULL
,唯一性约束不适用。@IvoP,我编辑了这个问题。我允许
电子邮件
接受空值,但它存在“生成重复索引”问题。是的,我绝对希望这样,但我想知道为什么mysql不能正确工作并生成此问题。@Amin mysql允许在唯一索引中使用多个空值。您使用的是什么版本的MySQL?您能发布您的实际
CREATE TABLE
语句吗?你发布的那条没有唯一索引,因此你得到了重复的键错误,这不是正确的
CREATE TABLE
语句。我通过电子邮件将多记录插入了空模式。