2017-10-10 56 views
3

我想补充流动insertMysql的添加NULL来,在插入跳过的cols和山坳是唯一

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在数据库中,没有任何问题,但跳过的列,如emailNULL填充,当试图添加另一个用户时,发送电子邮件得到重复k来自数据库的错误。

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

例如passwordResetTokenemailNULLfamily没有。 价值在family列没有问题,但email使。

+1

请将该表的创建代码添加到问题中。 –

+0

你可以添加表架构吗? –

+1

由于'NULL'不等于或不等于'NULL',所以唯一性约束不适用。 – tadman

回答

1

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

如果你真的想对user.email列的唯一索引,并允许多行无email值,那么你就需要改变你的表格,使user.email列允许NULL值。

下面是使用你的模式来展示如何通过NULLemail值,尽管唯一索引成功添加多行的例子:

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) 
+0

我允许'email'接受null,但是它使得重复的索引问题。 – Amin

+0

是的,我想绝对这个,但我想知道为什么MySQL不正常工作,使这个问题。 – Amin

+0

@Amin MySQL允许在唯一索引中有多个NULL值。你使用的是什么版本的MySQL?你可以发布你的_actual_ CREATE TABLE语句吗?你发布的那个没有唯一的索引,所以你得到了重复的键错误,那么这不是正确的CREATE TABLE语句。 –

0

您的问题的原因是两件事情:

1 )你确实允许为email插入NULL值。 这样就没有理由出现错误,因为您可以看到Family列没有任何问题。

2)另一方面,您需要列email具有唯一值。 而且这是与允许空值进行契约。 我不确定您是否能够在email中插入至少1条带有NULL的记录,但多个带NULL的插入操作会触发这些“重复值”的错误。

因此:不要让你的应用程序中插入NULL email

+0

我通过电子邮件插入了多条记录。 – Amin

0

我终于通过掺杂数据库解决我的问题,然后再重新创建并插入备份行了这一点。

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