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

时间:2017-10-10 16:09:47

标签: 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, 1507650436)

在数据库中我有这个:

Database values

系列中的空值为null保存在数据库中并且没有问题,但跳过email填充NULL的cols,并且当尝试添加其他用户whiteout时,电子邮件会重复来自数据库的关键错误。

  

注意: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;

例如passwordResetTokenemail提供NULLfamily不提供。 family col中的值没有问题,但email make。

3 个答案:

答案 0 :(得分:1)

最有可能的答案是您使用默认值创建了user.emailNOT 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 :(得分:0)

我最终通过兴奋剂数据库解决了我的问题并再次创建并插入备份行。

我不知道为什么会出现这个问题。

答案 2 :(得分:-1)

问题的原因有两个:

1)您确实允许为email插入NULL值。 仅凭这一点并不是错误的原因,因为您可以看到列Family没有任何问题。

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

所以:不要让你的应用程序在email

中插入null