我正在尝试添加流动的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
保存在数据库中并且没有问题,但跳过email
填充NULL
的cols,并且当尝试添加其他用户whiteout时,电子邮件会重复来自数据库的关键错误。
注意:
这个问题很奇怪,因为它过去有效。
表架构是:
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
提供NULL
但family
不提供。
family
col中的值没有问题,但email
make。
答案 0 :(得分:1)
最有可能的答案是您使用默认值创建了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 :(得分:0)
我最终通过兴奋剂数据库解决了我的问题并再次创建并插入备份行。
我不知道为什么会出现这个问题。
答案 2 :(得分:-1)
问题的原因有两个:
1)您确实允许为email
插入NULL值。
仅凭这一点并不是错误的原因,因为您可以看到列Family
没有任何问题。
2)另一方面,您要求列email
具有唯一值。
这就是允许空值的收缩。
我不确定你是否能够在email
中插入至少1个带NULL的记录,但是多个带NULL的插入将触发错误,这些“值”是重复的。
所以:不要让你的应用程序在email